Scheme 格式中斐波那契尾递归的解释?
我一直在试图理解Scheme中的尾部递归,我很难理解在go to示例中使用Fibonacci的尾部递归时发生了什么 如果这是尾部递归或迭代斐波那契的代码:Scheme 格式中斐波那契尾递归的解释?,scheme,fibonacci,Scheme,Fibonacci,我一直在试图理解Scheme中的尾部递归,我很难理解在go to示例中使用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))
(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)
谢谢 在
fib
程序中有一个输入错误(缺少一个左括号),应定义如下:
(define (fib n)
(fib-iter 1 0 n))
话虽如此,迭代的fib
过程使用一个名为fib iter
的助手来实现实际的迭代。这一行:
(fib-iter 1 0 n)
只是第一次打电话给助手。如你所知,斐波那契级数从n=0
和n=1
的值0
开始,这正是我们作为参数传递的值,以开始迭代循环,以及n
的值,这是我们在停止之前要进行的迭代次数
从那时起,a
将包含n-1
的斐波那契值,b
将包含n-2
的斐波那契值,迭代中的每个后续步骤都会相应地更新a
和b
变量,直到n
为零,在这一点上,我们停止并返回结果
如果我们以命令式风格编写相同的算法,那么可能更容易描述发生了什么。下面是Python中使用显式循环构造和相同变量名的一个示例。这相当于方案的实施:
def fib(n):
count = n
a, b = 1, 0
while count != 0:
a, b = a + b, a
count = count - 1
return b
您的代码中有一个错误<代码>fib应该是一个过程:
(define (fib n)
(fib-iter 1 0 n))
is的作用是调用fib iter
,初始值为a(=1)、b(=0)和count(=fibonacci数,它是形式参数n
到fib
)
将打印的“语句”添加到fib iter
显示发生了什么,在本例中为(fib 7)
:
我不明白为什么不会(谎言01 n)非常感谢!我终于可以振作起来了it@Sarah如果
fib iter
的编写方式稍有不同,比如(if(zero?count)a(fib iter b(+ab)(-count 1))
。但是在你的例子中,a
和b
的角色从它们的传统意义上被交换了。”(define(fib n);define函数fib和变量n“不完全如此——这定义了函数fib
,它使用一个名为n
的参数。类似地,(define(fib iter…
定义函数fib iter
,该函数使用3个参数,第一个参数名为a
,第二个参数名为b
,第三个参数名为count。若要可视化尾部递归的工作方式,请在(fib iter a b count)
表单的上方和下方绘制两条水平线。您得到的是一个框架,一个带三个插槽的命名框(在本例中)。然后每个调用(fib iter x y z)
只将三个值x y z
放入帧的三个插槽中,然后(重新)开始执行。
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)`