Scheme中的中间递归函数值

时间:2018-04-28 18:51:06

标签: recursion scheme

假设我们想在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)))

它以形成错误的特殊形式打破:(让(......))错误。

1 个答案:

答案 0 :(得分:2)

您走在正确的轨道上,让我们不会出现问题,以下工作正常。

(define (f n)
  (if (zero? n)
      1
      (let ((next (f (- n 1))))
        (+ next (/ 1 next)))))
相关问题