假设我们想在Scheme中实现以下递归函数:
f(n)= f(n-1)+ 1 / f(n-1)[n> 0] f(n)= 1 [n = 0]
一种简单的方法就是这样:
(define (f n) (if (zero? n) 1 (+ (f (- n 1)) (/ 1 (f (- n 1))))))
但是,当重复(f( - n 1))子表达式时,这段代码并不那么优雅。有没有办法通过将名称绑定到此中间值来改进此代码?
请注意, let 结构不能在这里使用,因为理论上这会导致函数永远递归。实际上它会导致Scheme错误。
更新:
以下是我的代码:
(define (afunc s n)
(if (> n 0)
(* .5
(let ((next (afunc s (- n 1)))
(+ next (/ s next))))
s)))
它以形成错误的特殊形式打破:(让(......))错误。
答案 0 :(得分:2)
您走在正确的轨道上,让我们不会出现问题,以下工作正常。
(define (f n)
(if (zero? n)
1
(let ((next (f (- n 1))))
(+ next (/ 1 next)))))