Scheme:将递归过程更改为迭代过程

时间:2016-12-07 14:18:31

标签: scheme iteration

这是函数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}}

花了好几个小时,但我看不出我做错了什么。 我知道代码是重复和笨重的,但我希望在改进语法之前看到我对该过程没有理解的内容。

感谢。

1 个答案:

答案 0 :(得分:2)

错误的一部分,你的代码的问题是只有函数basemaker是尾递归的,而不是g-helper,因为在它的体内,“last”调用是{ {1}},而不是+本身。

要以尾递归方式编写递归函数,通常通过添加一个参数来对函数进行转换,该参数在计算过程中“累积”部分结果,并在最后返回。在这种情况下,我们需要三个附加参数,以便在计算过程中保留函数的三个结果的轨迹,因为,要计算值 n 的函数,它是必须使用前三个值。所以这是一个可能的解决方案

g-helper

最初,参数分别为n = 2,n = 1和n = 0分配函数的值,并且在计算过程中,从前三个值计算函数的新值,它是通过“移动”其他两个值传递到下一个迭代。 当我们达到小于3的值(即2)时,该过程终止,结果是函数的先前结果。