Was ist die Erklärung für die Übung 1.6 in SICP?
Bin ich mit der Arbeit gerade erst durch SICP (auf meinen eigenen; dies ist nicht für eine Klasse), und ich habe gekämpft, mit Übung 1.6 seit ein paar Tagen und ich kann einfach nicht scheinen, um es herauszufinden. Das ist das einzige, wo Alyssa re-definiert if
im Hinblick auf cond
etwa so:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause))
Sie tests, die Sie erfolgreich auf einige einfache Fälle, und setzt es dann neu zu schreiben das square-root-Programm (das funktioniert nur mit if
):
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
Dann die Frage stellt: "Was passiert, wenn Alyssa versucht Sie diese zu berechnen Quadrat-Wurzeln? Erklären." [Wenn nötig, ich bin glücklich, zu reproduzieren, die anderen Verfahren ( good-enough?
, improve
usw.), lass es mich wissen.]
Nun, ich weiß, was passiert: es nie einen Wert zurückgibt, was bedeutet, dass das Programm eine Rekursion unendlich. Ich kann mir einfach nicht erklären, warum dies geschieht. Was auch immer feine Unterschied besteht zwischen if
und new-if
ist entzieht sich mir. Jegliche Hilfe sehr geschätzt.
- Die verb-form von "rekursiv" ist, "recurse", damit es "bezieht".
- Vergleichen Sie auch bis 4.25: community.schemewiki.org/?sicp-ex-4.25
Du musst angemeldet sein, um einen Kommentar abzugeben.
new-if
ist eine Funktion. Wenn eine Funktion aufgerufen wird, was ist die erste Sache, dass die Regelung nicht mit der argument-Liste? Es wertet alle die Argumente.new-if
ist eine Prozedur und Schema verwendet applicative-order evaluation (1.1.5), so auch vornew-if
tatsächlich ausgeführt wird, muss es bewertet alle Argumente zuerst, dieguess
und(sqrt-iter (improve guess x) x)
. Sie können sehen, dass das letztere argument ist eine Rekursion, die fordert, eine neuenew-if
Verfahren, so wird die unendliche Schleife Auftritt.Ordentlichen
if
müssen nicht bewerten, seine Argumente zuerst, gehen Sie einfach entlang des Weges, das ist der Unterschied zwischenif
undnew-if
. 🙂new-if
Verfahren hat drei Argumente:predicate
,then-clause
undelse-clause
. Also, wennnew-if
genannt wird,(good-enough? guess x)
,guess
, und(sqrt-iter (improve guess x))
ausgewertet werden. Ist das richtig ? Das ändert nichts an dem Ergebnis, denn nur die Bewertung vonsqrt-iter
verursacht die Schwierigkeiten. Aber imo haben Sie vergessen, ein argument...Zunächst müssen Sie verstehen Sie den Unterschied zwischen applicative order evaluation und normal um. Lisp verwendet applicative Ordnung, aber bedingte Ausdrücke werden ausgewertet, nicht wie normale Funktionen (sicp Kapitel 1.1.6):
Ex1.6. neu-wenn:
Unterschied mit "wenn-Aussagen':
if-Anweisungen auswerten einer von einer von Prädikat -> damit -> alternative,
jedoch die "neue-wenn' ausgewertet werden muss, um alle Parameter aka Argumente der MOMENT, die genannt werden(was bedeutet, dass 'else-Klausel ausgewertet am start!!!!),
und so bewirkt dies eine Endlosschleife, wenn alle diese Parameter nennen sich in einer iterativen Schleife