Frage

Ich bin erst am Anfang durch SICP arbeiten (auf meinem eigenen, nicht für eine Klasse ist), und ich habe mit Übung 1.6 für ein paar Tage zu kämpfen, und ich kann einfach nicht scheinen, um einen Reim aus. Dies ist die eine, wo Alyssa if in Bezug auf cond-re definiert, etwa so:

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
          (else else-clause))

Sie testet erfolgreich auf einigen einfachen Fällen und verwendet sie dann, um die Quadratwurzel Programm neu zu schreiben (was ganz gut mit if gearbeitet):

(define (sqrt-iter guess x)
    (new-if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x)
                       x)))

Die Frage ist dann fragt: „Was passiert, wenn Alyssa dies zu nutzen versucht, Quadratwurzeln zu berechnen erklären?“. [Falls nötig, ich bin glücklich, die anderen Verfahren (good-enough?, improve, etc.) zu reproduzieren, mich nur wissen lassen.]

Nun, ich weiß, was passiert: es gibt nie einen Wert, was bedeutet, dass das Programm recurses unendlich. Ich kann einfach nicht erklären, warum dies geschieht. Was auch immer feiner Unterschied besteht zwischen if und new-if ist mir entzieht. Jede und alle Hilfe sehr geschätzt.

War es hilfreich?

Lösung

new-if ist eine Funktion. Wenn eine Funktion aufgerufen wird, was ist das erste, was Schema funktioniert mit der Argumentliste? Er wertet alle die Argumente.

Andere Tipps

new-if ist ein Verfahren, und Schema verwendet applicative Ordnung Bewertung (1.1.5), so dass auch vor new-if tatsächlich durchgeführt wird, hat es zunächst alle Argumente zu bewerten, das sind guess und (sqrt-iter (improve guess x) x). Sie können sehen, dass das letzte Argument eine Rekursion, das eine neue new-if Prozedur aufruft, das ist, wie die Endlosschleife auftritt.

Der gewöhnliche if nicht ihre Argumente zunächst bewerten muss, gerade auf dem Weg zu gehen, das ist der Unterschied zwischen if und new-if. :)

Zu allererst müssen Sie , um die Differenz zwischen applicative um Auswertung und normale Ordnung. Lisp verwendet applicative Ordnung, aber bedingte Ausdrücke werden ausgewertet nicht normale Funktionen wie ( SICP Kapitel 1.1.6 ):

(if <predicate> <consequent> <alternative>)
  

Um zu bewerten, ein, wenn Ausdruck, beginnt der Interpreter durch den <predicate> Teil des Ausdrucks auswertet. Wenn die <predicate> zu einem wahren Wert auswertet, wertet der Interpreter dann die <consequent> und gibt seinen Wert zurück. Andernfalls wertet er die <alternative> und gibt seinen Wert zurück.

Ex1.6. neu, wenn:

(define (new-if predicate then-clause else-clause)
     (cond (predicate then-clause)
                (else else-clause)))

Differenz mit ‚if-Aussagen‘: if-Anweisungen auswerten eins nach dem anderen aus Prädikat -> daraus folgenden -> Alternative

jedoch die ‚new-if‘ hat alle Parameter aka Argumente, den Augenblick zu beurteilen ihre Namen (was bedeutet, ‚else-Klausel‘ zu Beginn ausgewertet wird !!),

und so bewirkt dies eine Endlosschleife, wenn einer dieser Parameter sich in einer iterativen Schleife rufen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top