理解 Python 中的递归

2025-02-11 09:51:00
admin
原创
52
摘要:问题描述:我真的在努力弄清楚递归的工作原理并理解递归算法。例如,当我输入 5 时,下面的代码返回 120,请原谅我的无知,我只是不明白为什么?def fact(n): if n == 0: return 1 else: return n * fact(n-1) ...

问题描述:

我真的在努力弄清楚递归的工作原理并理解递归算法。例如,当我输入 5 时,下面的代码返回 120,请原谅我的无知,我只是不明白为什么?

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n-1)

answer = int (raw_input('Enter some number: '))

print fact(answer)

解决方案 1:

让我们看一下执行过程。

fact(5):
   5 is not 0, so fact(5) = 5 * fact(4)
   what is fact(4)?
fact(4):
   4 is not 0, so fact(4) = 4 * fact(3)
   what is fact(3)?
fact(3):
   3 is not 0, so fact(3) = 3 * fact(2)
   what is fact(2)?
fact(2):
   2 is not 0, so fact(2) = 2 * fact(1)
   what is fact(1)?
fact(1):
   1 is not 0, so fact(1) = 1 * fact(0)
   what is fact(0)?
fact(0):
   0 IS 0, so fact(0) is 1

现在让我们收集结果。

fact(5) = 5* fact(4)

用我们的结果代替事实(4)

fact(5) = 5 * 4 * fact(3)

用我们的结果代替事实(3)

fact(5) = 5 * 4 * 3 * fact(2)

用我们的结果代替事实(2)

fact(5) = 5 * 4 * 3 * 2 * fact(1)

用我们的结果代替事实(1)

fact(5) = 5 * 4 * 3 * 2 * 1 * fact(0)

用我们的结果代替事实(0)

fact(5) = 5 * 4 * 3 * 2 * 1 * 1 = 120

就是这样。递归是将大问题分解为多个小问题的过程,直到达到简单(或“基本”)情况。

解决方案 2:

将问题分解为执行步骤。

fact(5)
| 5  * fact(4)
|| 5 * (4 * fact(3))
||| 5 * (4 * (3 * fact(2))
|||| 5 * (4 * (3 * (2 * fact(1))))
||||| 5 * (4 * (3 * (2 * (1 * fact(0)))))
|||||| 5 * 4 * 3 * 2 * 1 * 1
120

您的函数只是调用自身,就像任何其他函数可以调用它一样。但是在这种情况下,您的函数需要一个停止点,以便它不会无限递归(导致堆栈溢出!)。在您的例子中,这是当n为 0 时(它可能应该是 1)。

解决方案 3:

请记住,每次调用 fact() 时,无论是外部调用还是自身调用,都会获得一组独特的局部变量。

fact(1) has n of 5
   fact(2) has n of 4
      fact(3) has n of 3
         fact(4) has n of 2
            fact(5) has n on 1
               fact(6) has n of 0

最深的层(这里fact(6)是指最深的层)在调用堆栈中位于其上方的层完成之前就已经完全计算出来了。

所以

  • fact(6)返回 1 fact(5)(终止情况)。

  • fact(5)返回 1 到fact(4)(1*1)

  • fact(4)将 2 返回到fact(3)(2*1)

  • fact(3)将 6 返回给fact(2)(3*2)

  • fact(2)返回 24 到fact(1)(4*6)

  • 最后fact(1)返回 120(5*24)给它的调用者,无论它是什么。

解决方案 4:

递归函数是调用自身并持续执行直到评估完成并产生结果的函数。上面的阶乘函数的关键是返回 x * fact(x-1)

因此,如果您输入 5,它将执行 5 fact(5-1) fact 4-1) .... 依此类推,直到达到 0 然后返回 1。因此,您将得到 54321,即 120。

它继续在堆栈上分配变量。因此,如果您输入的数字过高,可能会导致堆栈溢出异常。除非您使用所谓的尾部调用优化 (TCO),它将递归函数变成 for 循环并清理分配的内存。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用