Recursion Scheme中的中间递归函数值

Recursion Scheme中的中间递归函数值,recursion,scheme,Recursion,Scheme,假设我们希望在Scheme中实现以下递归函数: f(n)=f(n-1)+1/f(n-1)[n>0] f(n)=1[n=0] 一个简单的方法是这样: (定义(fn)(if(zero?n)1(+(f(-n1)))(/1(f(-n1щ)!)) 但是,由于(f(-n1))子表达式被重复,这段代码并没有那么优雅。有没有办法通过将名称绑定到此中间值来改进此代码 注意,这里不能使用let构造,因为理论上这会导致函数永远递归。实际上,这会导致方案错误 更新: 以下是我的let代码: (define (afunc

假设我们希望在Scheme中实现以下递归函数:

f(n)=f(n-1)+1/f(n-1)[n>0] f(n)=1[n=0]

一个简单的方法是这样:

(定义(fn)(if(zero?n)1(+(f(-n1)))(/1(f(-n1щ)!))

但是,由于(f(-n1))子表达式被重复,这段代码并没有那么优雅。有没有办法通过将名称绑定到此中间值来改进此代码

注意,这里不能使用let构造,因为理论上这会导致函数永远递归。实际上,这会导致方案错误

更新

以下是我的let代码:

(define (afunc s n)
    (if (> n 0)
        (* .5
            (let ((next (afunc s (- n 1)))
                (+ next (/ s next))))
                s)))

它以一个格式不正确的特殊形式中断:(let(…)错误。

您走在正确的轨道上,let不施加任何问题,以下操作按预期进行

(define (f n)
  (if (zero? n)
      1
      (let ((next (f (- n 1))))
        (+ next (/ 1 next)))))

你是在正确的轨道上,让我们不要强加一个问题,下面的工程如预期

(define (f n)
  (if (zero? n)
      1
      (let ((next (f (- n 1))))
        (+ next (/ 1 next)))))

谢谢@christoph。你的代码对我有用。请查看更新的问题。谢谢@christoph。你的代码对我有用。请查看更新的问题。您有一个括号问题;
(+next…
let
的绑定列表中,
s
不是
if
的“else”。谢谢@molbdnilo,你是对的,我忘记了事实方案的if总是需要三个参数。你有一个括号问题;
(+下一步…
let
的绑定列表中,
s
不是
if
的“else”。谢谢@molbdnilo,你是对的,我忘记了Scheme的if总是需要三个参数。