Scheme 如何使Tribonaci函数尾部递归?

Scheme 如何使Tribonaci函数尾部递归?,scheme,racket,r5rs,Scheme,Racket,R5rs,我正在制作一个Tribonaci函数,给定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 (

我正在制作一个Tribonaci函数,给定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)))))))) 
(定义(tribonacci n)
(如果(n0)
(+(tribonacci(-n1))(+(tribonacci(-n2))(tribonacci(-n3щщщ))

任何使用前一个答案计算下一个答案的递归函数都可以通过保持变量数量作为基本情况来进行迭代。在普通
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
是从第二个值开始的所有斐波那契数,我们计算的结果比我们需要的多一个。另一种方式是,变量就像一个窗口,在斐波那契数上移动


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

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

(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)))