Recursion Scheme中的中间递归函数值
假设我们希望在Scheme中实现以下递归函数: f(n)=f(n-1)+1/f(n-1)[n>0] f(n)=1[n=0] 一个简单的方法是这样: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
(定义(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总是需要三个参数。