【问题标题】:recursive function running infinitely even while calling return即使在调用return时递归函数也无限运行
【发布时间】:2019-08-20 13:29:34
【问题描述】:

我创建了一个基本的 Python 函数来递归打印斐波那契数。但是,在打印完所有数字后,它会继续无限打印 0

我尝试使用 return 关键字并在之前添加一个 if 语句来检查变量是否大于应有的大小,但它仍然没有工作

class RecFibonnacci:

    def recFib(self, firstTerm, secondTerm):
        Fterm = firstTerm
        Sterm = secondTerm

        if Fterm <= 1000:
            print(Fterm)
            tempStrg = Fterm
            Sterm += Fterm
            Fterm = tempStrg
            self.recFib(Fterm, Sterm)
        return

if __name__ == '__main__':
    recFibonacci = RecFibonnacci()
    recFibonacci.recFib(0, 1)

它应该打印从 1 到 987 的所有斐波那契数。它打印它们,但之后,它永远打印 0

【问题讨论】:

  • 你没有基本情况,你总是调用 recFib(0,1)
  • 第一项永远不会增加
  • 就像我之前提到的,我尝试将它放在“if Fterm > 1000: return”之前,但没有成功
  • 我认为您不清楚参数如何传递给函数。阅读按值传递与按引用传递。你用 Fterm 和 Sterm 做的所有杂技都是没有意义的。
  • 在 python 中搜索一个基本的斐波那契函数,并在将其传递给类方法之前将其实现。

标签: python recursion


【解决方案1】:

虽然其他答案可能会产生工作代码,但您需要了解您正在尝试做的事情等同于

def recFib(self, firstTerm, secondTerm):
    if firstTerm <= 1000:
        print(firstTerm)
        self.recFib(secondTerm, firstTerm + secondTerm)
    return

【讨论】:

  • 当真是简化的代码,谢谢哈哈。原来我刚刚弄乱了我的代码的一部分,我有另一个函数被调用并显示实际结果,而不是只打印 0 的递归。非常感谢
  • 不,就像其他人指出的那样,您的代码不正确,因为您创建了 3 个不需要的临时变量,从而使自己感到困惑。
【解决方案2】:

你的代码很好,除了一个小错误——

您的变量 Fterm 是第一个(上一个术语)值,而 Sterm 是第二个(第一个 + 第二个)并且您正在调用函数 self.recFib(Fterm, Sterm)

但是在递归调用变量 Fterm 时发生的事情是使用它的旧值,而不是更新后的值!因为它显然没有超过1000。 因此你可以在外面做两件事——

修改 1

    Fterm = firstTerm
    Sterm = secondTerm

    if Fterm<= 1000:            
        print(Fterm)
        #updating first variable, and second as well (first+second)
        self.recFib(Sterm, Sterm+Fterm)
    return

修改 2

if Fterm <= 1000:           
   print(Fterm)
   tempStrg = Fterm
   Sterm += Fterm
   Fterm = tempStrg
   # passing second as first, and first as second
   self.recFib(Sterm, Fterm)
return

【讨论】:

    【解决方案3】:

    实际上这是一个很好的代码,除了一个小错误。 您应该替换该行

    tempStrg = Fterm
    

    用线

    tempStrg = Sterm
    

    【讨论】:

    • 什么部分?如果是关于印刷品,那我错了,很好,我编辑了答案:)
    【解决方案4】:

    我认为tempStrg = Fterm 应该改为tempStrg = Sterm。这是因为如果您将 Fterm 分配给 tempStrgFterm 将保持为 0。这是因为第一项 Fterm 永远不会增加。原因如下:tempStrg = Fterm 将其设为 0。然后,如果您将 Fterm 更改为该值,它仍然为零。这就是为什么它总是永远输出 0。这是您代码中的一个小错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2011-11-16
      • 2021-05-13
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多