大大大大力无限 发表于 2023-5-8 20:27:14

python 递归

def fib1(n):
    if n == 1 or n == 2:
      return 1
    else:
      return fib1(n-1) + fib(n-2)

   
fib1(12)
144

请教大神,我这里写的fib1(n-1)+fib(n-2)中第二个fib没写对,都可以出结果,这是什么原理呀,我以为会报错呢

isdkz 发表于 2023-5-8 20:27:38

你好!这是因为在递归调用中, fib1(n-1) 已经计算出结果并返回,而 fib(n-2) 的错误被忽略了。在这种情况下,Python会在运行时尝试查找变量 fib ,如果找不到,则会引发 NameError 异常。但是,由于你的代码中没有定义 fib 变量,Python会尝试在全局命名空间中查找 fib 变量,而这个变量可能已经被其他代码定义了。如果找到了这个变量,Python就会使用这个变量的值,而不是引发 NameError 异常。

因此,你需要将 fib1(n-1) + fib(n-2) 中的 fib 改为 fib1 ,即 fib1(n-1) + fib1(n-2) ,这样才能保证代码的正确性。

sfqxx 发表于 2023-5-8 20:47:13

你好!这是一个常见的错误,由于 `fib1` 和 `fib` 的命名很相似,所以可能会导致一些混乱。在你提供的代码中,在第 5 行应该将 `fib` 改为 `fib1` 以便递归函数正确返回。实际上,你采用的是经典的斐波那契数列算法,使用递归形式计算斐波那契数值,在使用时输入12已经得到正确的结果了。
   
当你写 `fib1(n-1) + fib(n-2)` 时,Python 将尝试调用名为 `fib()` 的函数来解决它。 但由于没有定义名为 `fib()` 的函数,因此将引发“未定义名”(NameError)错误。 但请注意,即使发生这样的错误,整个递归过程仍将持续进行,因为包含有关斐波那契数列前两个数字的重要信息的函数调用仍然有效。

因为 Python 通过缓存先前返回结果的方式实现了尾递归优化,这往往可以防止递归崩溃和堆栈溢出,即使在更复杂的例子中也是如此。 这就是为什么即使第二个函数名称错误,你的代码仍能正常执行并返回正确结果
有用请设置最佳答案
页: [1]
查看完整版本: python 递归