最近,提出了一个问题"How to find mistake in my sequence. DrRacket, Scheme",然后被一个不耐烦的提问者删除。
由于我正在输入我答案中最后几个字的过程,所以在此处重新发布,Q和A,以便它不会浪费。
这里引用几乎逐字:
我正在尝试解决这个问题:
我在do
循环中执行此操作,stop-expression的条件是
但我的do
循环不起作用。我找不到错误。请帮我。我的代码:
(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)
)
)
答案 0 :(得分:4)
缩进是你的朋友,而不是你的敌人:
(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)))
这个代码的方法很不寻常。它提醒了Prolog中的迭代深化。您正在尝试逐步增加步骤来解决它。
换句话说,您可以单独计算序列的 n 和(n-1)成员。但实际上,从后者到前者只需要一步。
以下是递归不是你朋友的情况。
Corecursion,即迭代,是你的朋友。
而不是在每一步上从 n 向下计数 0 ,而不是在每一步之前递增 n 的起始值;
0
1 0
2 1 0
3 2 1 0
....
为什么不只是简单地从 0 计算 up ,增量为 1 :
0 1 2 3 ....
大胆前进直到条件成立?
但是我们关心到达解决方案需要多少步骤?我们不是!我们根本不需要n
。
更不用说(- 0 1)
是您的函数y
被do
中的f
循环强制处理的值,但却无法处理,导致无底递归。这只是从你的代码中跳出来的一个问题;还有更多(字符串不是函数),但实际上,代码需要进行大修。