递归地编码近似序列。 DrRacket,方案

Coding an approximation sequence recursively. DrRacket, Scheme

最近问了一个问题,"How to find mistake in my sequence. DrRacket, Scheme",然后被不耐烦的提问者删除了。

由于我正在打最后几个字,所以把Q和A转在这里,以免浪费。

此处引用几乎一字不漏:


我正在尝试解决这个序列:

我是在do循环中做的,停止表达式的条件是

但是我的 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)

)
 )

缩进是你的朋友,而不是你的敌人:

(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) 个成员。但实际上,从后者到前者只需要一步。


这里是递归不是你朋友的情况。

核心递归,即迭代,是你的朋友。

而不是在每一步从 n 向下计数到 0,同时递增 n[ 的起始值=48=]每一步之前;

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

为什么不简单地从 0 开始计算 up,增量为 1

0 1 2 3 ....

大胆前进直到条件成立?

但是我们关心解决方案需要多少步骤呢?我们不!我们根本不需要 n

更不用说 (- 0 1) 是您的函数 yf 中的 do 循环强制处理的值,但尚未配备处理,导致无底递归。这只是您的代码中突然出现的一个问题;还有更多(字符串不是函数),但实际上,代码无论如何都需要大修。