/ / Eine Approximationssequenz rekursiv codieren. DrRacket, Scheme - Rekursion, Schema, Racket, Sequenz, Approximation

Eine Näherungssequenz rekursiv kodieren. DrRacket, Scheme - Rekursion, Schema, Racket, Sequenz, Approximation

Vor kurzem wurde eine Frage gestellt, "Wie finde ich Fehler in meiner Sequenz? DrRacket, Scheme"und dann von einem ungeduldigen Fragesteller gelöscht.

Da ich gerade die wenigen letzten Worte meiner Antwort tippte, wird hier das Q und das A noch einmal geschrieben, damit es nicht verloren geht.

Hier ist es zitiert fast wörtlich:


Ich versuche diese Sequenz zu lösen:

Bildbeschreibung hier eingeben

Ich mache es in einem do Schleife, die Bedingung der Stop-Ausdruck ist

Bildbeschreibung hier eingeben

Aber mein do Schleife funktioniert nicht. Ich kann keinen Fehler finden. Bitte hilf mir. Mein Code:

(define (y a n x )
(if (= n 0)
a
(* 0.5 (+ (y a (- n 1) x) (/ x (y a (- n 1) x))))
)
)
(define (f a x e)

(do
( (n 0 (+ n 1)) )


( ( < (abs (- (sqr (y a n x)) (sqr (y a (- n 1) x)))) e) ("end of loop"))

(display (y a n x))
(newline)

)
)

Antworten:

4 für die Antwort № 1

Einzug ist dein Freund, nicht dein Feind:

(define (y a n x)
(if (= n 0)
a
(* 0.5 (+      (y a (- n 1) x)
(/ x (y a (- n 1) x)) )) ))

(define (f a x e)
(do ( (n 0 (+ n 1)) )
( (< (abs (- (sqr (y a    n    x))
(sqr (y a (- n 1) x)) ))
e)
("end of loop"))
(display (y a n x))
(newline)))

Dieser Code ist in seiner Vorgehensweise ziemlich ungewöhnlich. Es erinnert an iterative Vertiefung in Prolog. Sie versuchen, es in schrittweise zunehmender Anzahl von Schritten zu lösen.

Anders ausgedrückt, berechnen Sie die nth und die (n-1)th Mitglied der Sequenz in Isolation. Aber wirklich, es braucht nur einen Schritt, um von letzterem zu ersteren zu gelangen.


Hier ist die Situation, in der Rekursion nicht dein Freund ist.

Corecursion, d.h. Iteration, ist hier dein Freund.

Anstatt von zu zählen n bis zu 0 in jedem Schritt, während der Startwert von n vor jedem Schritt die ganze Zeit;

0
1 0
2 1 0
3 2 1 0
....

warum nicht einfach zählen oben, von 0, in Schritten von 1:

0 1 2 3 ....

mutig vorwärts gehen, bis die Bedingung erfüllt ist?

Aber was kümmert es uns, wie viele Schritte hat es gedauert, um die Lösung zu erreichen? Wir brauchen es nicht! Wir brauchen es nicht n überhaupt.

Ganz zu schweigen davon (- 0 1) ist ein Wert, der deine Funktion erfüllt y ist gezwungen, sich mit zu beschäftigen, durch die do einhängen f, ist jedoch nicht ausgestattet zu handhaben, zu führenbodenlose Rekursion. Und das ist nur das eine Problem, das mich aus deinem Code herausgeholt hat; da ist mehr (ein String ist keine Funktion), aber wirklich, der Code muss sowieso überarbeitet werden.