我一直在尝试理解Scheme中的尾递归,并且我很难理解在使用Fibonacci的尾递归的示例中发生了什么......
如果这是尾递归的代码,或迭代的Fibonacci:
(define (fib n)
(fib-iter 1 0 n))
(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
除了这里,我基本上能理解每一行发生的事情:
(fib-iter 1 0 n))
这一行实际发生了什么?我无法在任何地方找到解释。我是Scheme的新手,到目前为止语法很混乱。
或者任何人都可以解释每一行中发生的事情?这是我的基本理解,但我不确定我是否正确:
(define (fib n) ;;define the function fib and variable n
(fib-iter 1 0 n)) ;;?? no idea
(define (fib-iter a b count) ;;define function fib-iter, variables a, b and count
(if (= count 0) ;;if the count is equal to 0,
b ;;return b
(fib-iter (+ a b) a (- count 1)))) ;;recursively calling function fib-iter with 3 parameters (a+b), a and (count - 1)
谢谢!
答案 0 :(得分:4)
fib
程序中有一个拼写错误(缺少左括号),应定义如下:
(define (fib n)
(fib-iter 1 0 n))
话虽如此,迭代fib
过程使用一个名为fib-iter
的帮助器来实现实际的迭代。这一行:
(fib-iter 1 0 n)
第一次只是打电话给帮手。如您所知,斐波纳契数列以0
的值n=0
和1
的{{1}}开头,这正是我们所依据的值作为参数传递,以启动迭代循环,以及n=1
的值,这是我们在停止之前想要做的迭代次数。
从那时起,n
将包含a
的斐波那契值,n-1
将包含b
的斐波那契值,以及每个后续步骤迭代会相应地更新n-2
和a
变量,直到b
为零,此时我们停止并返回结果。
如果我们以命令式方式编写相同的算法,可能更容易想象发生了什么。这是Python中使用显式循环结构和相同变量名称的一个示例。这相当于Scheme实现:
n
答案 1 :(得分:2)
您的代码中存在错误; fib
应该是一个程序:
(define (fib n)
(fib-iter 1 0 n))
它的作用是fib-iter
,其初始值为a(= 1),b(= 0)和count(=你想要的斐波纳契数,这是形式参数n
到fib
)。
添加打印声明'到fib-iter
显示会发生什么,在此示例中为(fib 7)
:
a=1 b=0 count=7 ; initial values as given by `fib`
a=1 b=1 count=6
a=2 b=1 count=5
a=3 b=2 count=4
a=5 b=3 count=3
a=8 b=5 count=2
a=13 b=8 count=1
a=21 b=13 count=0
13 ; the returned value for `(fib 7)`