这是函数f(n)= n的递归过程,如果n <3且f(n)= f(n - 1)+ 2f(n - 2)+ 3f(n - 3),如果n≥ 3
(define (g n)
(if (< n 3)
n
(g-helper n)))
(define (g-helper n)
(if (< n 3)
n
(+ (basemaker 0 1 (- n 1))
(g-helper (- n 1))
(* 2 (basemaker 0 2 (- n 2))
(g-helper (- n 2)))
(* 3 (basemaker 0 3 (- n 3))
(g-helper (- n 3))))))
(define (basemaker counter constant n)
(cond ((= 2 n) 2)
((= 1 n) 1)
((= 0 n) 0)
(else
(basemaker (+ counter constant) constant (- n constant)))))
问题集是将其更改为迭代递归。我想出了这个:
> (f 3)
4
> (f 4)
11
> (f 5)
25
> (g 3)
6
> (g 4)
19
> (g 5)
45
>
出了点问题:
{{1}}
花了好几个小时,但我看不出我做错了什么。 我知道代码是重复和笨重的,但我希望在改进语法之前看到我对该过程没有理解的内容。
感谢。
答案 0 :(得分:2)
错误的一部分,你的代码的问题是只有函数basemaker
是尾递归的,而不是g-helper
,因为在它的体内,“last”调用是{ {1}},而不是+
本身。
要以尾递归方式编写递归函数,通常通过添加一个参数来对函数进行转换,该参数在计算过程中“累积”部分结果,并在最后返回。在这种情况下,我们需要三个附加参数,以便在计算过程中保留函数的三个结果的轨迹,因为,要计算值 n 的函数,它是必须使用前三个值。所以这是一个可能的解决方案
g-helper
最初,参数分别为n = 2,n = 1和n = 0分配函数的值,并且在计算过程中,从前三个值计算函数的新值,它是通过“移动”其他两个值传递到下一个迭代。 当我们达到小于3的值(即2)时,该过程终止,结果是函数的先前结果。