如何使tribonacci函数尾递归?

时间:2018-03-24 20:59:21

标签: scheme racket r5rs

我正在制作一个tribonacci函数,给定n,返回值,n(0)= 0,n(1)= 0,n(2)= 1。
我当前的代码只是正常的递归,但我怎样才能使它尾递归?

(define (tribonacci n)
 (if ( < n 0) #f
  (cond ((= n 0) 0)
        ((= n 1) 0)
        ((= n 2) 1)
        ((> n 0)
          (+ (tribonacci (- n 1)) (+ (tribonacci (- n 2))(tribonacci (- n 3)))))))) 

2 个答案:

答案 0 :(得分:3)

使用一些先前的答案来计算下一个的递归函数可以通过将变量的数量保持为基本情况来迭代进行。在普通fibonacci的情况下,你有两个基本案例,下一个值总是前两个的总和

(define (fib n)
  (let loop ((n n) (a 0) (b 1))
    (if (zero? n)
        a
        (loop (- n 1) b (+ a b)))))

所以想象一下,你希望(fib 4)进行这些迭代:

n a b
4 0 1
3 1 1
2 1 2
1 2 3
0 3 5 

请注意,a实际上是从开头的所有斐波那契数字,而b是来自第二个值的所有斐波那契数字,我们计算的数字比我们需要的结果多一个。另一种看待它的方法是变量就像一个在斐波那契数字上移动的窗口。

我会让你对你的特殊版本做同样的事情,因为它可以使用迭代循环中的第三个变量以完全相同的方式解决。祝你好运!

答案 1 :(得分:0)

这是一个使用尾递归函数的版本。

(define (tribonacci n)
  (define (helper n a b c)
    (format #t "a: ~a, b: ~a, c: ~a\n" a b c)
    (if (= n 0)
      a
      (helper (- n 1) b c (+ a b c))))

  (if ( < n 0) #f
    (helper n 0 0 1)))

执行(tribonacci 10)的输出:

a: 0, b: 0, c: 1
a: 0, b: 1, c: 1
a: 1, b: 1, c: 2
a: 1, b: 2, c: 4
a: 2, b: 4, c: 7
a: 4, b: 7, c: 13
a: 7, b: 13, c: 24
a: 13, b: 24, c: 44
a: 24, b: 44, c: 81
a: 44, b: 81, c: 149
a: 81, b: 149, c: 274