当前位置: 首页 > 知识库问答 >
问题:

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

葛奇
2023-03-14

我一直在试图理解Scheme中的尾部递归,我很难理解在使用斐波那契尾部递归的go-to示例中发生了什么。。。

如果这是尾递归或迭代斐波那契的代码:

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

谢谢

共有2个答案

郭阳曜
2023-03-14

您的代码中有错误<代码>fib应该是一个过程:

(define (fib n)
  (fib-iter 1 0 n))

它的作用是调用fib-iter,初始值为a(=1)、b(=0)和count(=您想要的斐波那契数,这是nfib的形式参数)。

将打印“语句”添加到fib iter中显示了发生的情况,在本例中,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)`
劳彦
2023-03-14

fib过程中有一个输入错误(缺少左括号),应定义如下:

(define (fib n)
  (fib-iter 1 0 n))

话虽如此,迭代fib过程使用名为fib-iter的助手来实现实际迭代。这一行:

(fib-iter 1 0 n)

只是第一次给助手打电话。众所周知,斐波那契级数从n=0的值和n=1的值开始,这正是我们作为参数传递的值,以开始迭代循环,以及n的值,这是我们在停止之前要进行的迭代次数。

从那时起,a将包含n-1的斐波那契值,b将包含n-2的斐波那契值,迭代中的每个连续步骤都会相应地更新ab变量,直到n为零,此时我们停止并返回结果。

如果我们以命令式风格编写同一个算法,可能更容易描述发生了什么。下面是Python中使用显式循环构造和相同变量名的一个示例。这相当于方案实施:

def fib(n):
    count = n
    a, b = 1, 0
    while count != 0:
        a, b = a + b, a
        count = count - 1
    return b

 类似资料:
  • 我很难理解尾递归的概念,我想做一个斐波那契函数的尾递归版本,到目前为止,这是我想出的,但我不知道它是否正确,有人能帮我吗,任何帮助都将不胜感激 代码编译并输出正确的结果

  • 问题内容: 我在大学为我的Programming II类编写的程序需要一些帮助。这个问题要求人们使用递归来计算斐波那契数列。必须将计算出的斐波那契数存储在一个数组中,以停止不必要的重复计算并减少计算时间。 我设法使程序在没有数组和存储的情况下运行,现在我试图实现该功能,但遇到了麻烦。我不确定如何组织它。我已经浏览了Google并浏览了一些书,但没有太多帮助我解决如何实施解决方案的方法。 上面是不正

  • 问题内容: 请解释以下简单代码: 我对最后一行感到困惑,特别是因为例如,如果n = 5,则将调用fibonacci(4)+ fibonacci(3),依此类推,但我不理解该算法如何以此来计算索引5的值方法。请详细解释! 问题答案: 在斐波那契数列中,每一项都是前两项的总和。因此,你编写了一个递归算法。 所以, 现在你已经知道了。因此,你可以随后计算其他值。 现在, 从斐波那契数列中我们可以看到斐波

  • 我试图想出一个程序,从用户那里获取任何数字,并生成斐波那契码的第n个数字。当我完成工作时,它会显示下一个,而不是我需要的。例如,我正在寻找第11个#和它的生产233而不是144。这是我的代码:

  • 我很难理解尾部递归的概念,我想为类似斐波那契函数a(n-3)a(n-2)制作一个尾部递归版本,到目前为止,这是我提出的,但我不知道这是否是一个正确的方法,有人能帮我吗,任何帮助都将不胜感激 代码输出正确的结果 但是当我实现尾部递归时,我的方法是分而治之的,但它不起作用,输出是错误的

  • 本文向大家介绍Java递归实现斐波那契数列,包括了Java递归实现斐波那契数列的使用技巧和注意事项,需要的朋友参考一下 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所