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

时间:2017-12-13 21:09:35

标签: recursion scheme racket sequence approximation

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

由于我正在输入我答案中最后几个字的过程,所以在此处重新发布,Q和A,以便它不会浪费。

这里引用几乎逐字:

我正在尝试解决这个问题:

enter image description here

我在do循环中执行此操作,stop-expression的条件是

enter image description here

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

)
 )

1 个答案:

答案 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)是您的函数ydo中的f循环强制处理的值,但却无法处理,导致无底递归。这只是从你的代码中跳出来的一个问题;还有更多(字符串不是函数),但实际上,代码需要进行大修。