Scheme 格式中斐波那契尾递归的解释?

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

我一直在试图理解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))
这一行到底发生了什么?我到处找不到解释。我是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)`