python - 这段代码是怎么运行的
PHP中文网
PHP中文网 2017-04-17 13:10:55
[Python讨论组]

问这个问题的原因是做codecademy的一道题,要求建一个阶乘的函数,所以我是这样建立的:

def factorial(x):
    if x == 0 or x==1:
        return 1
    else:
        x=int(x)
        b=1
        while x>1:
            b=x*b
            x=x-1
        return b

但是我在论坛上面找到了一段简洁的多的代码:

def factorial(x):
    if  x==0:
        return 1
    return x * factorial(x-1)

第二个代码是怎么工作的呢,难道 他是把前面的依次算一次,直到1?

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
PHP中文网

你要知道每次函数的调用,在其底层都是一次push操作,函数调用完后就返回是一次pop操作。以刚才的print factorial(4)调用为例子,一步一步分析:

第一步:执行factorial(4),push一下

4 * ??

第二步:执行factorial(4-1),push一下

3 * ??
4 * ??

第三步:执行factorial(3-1),push一下

2 * ??
3 * ??
4 * ??

第四步:执行factorial(2-1),push一下

1 * ??
2 * ??
3 * ??
4 * ??

第五步:执行factorial(1-1),push一下,这个时候x == 0:return 1

1 * 1
2 * ??
3 * ??
4 * ??

到了这里,函数到了return 1返回出口,表示该递归函数的最后一次调用完成了,本次调用应该返回了。

第六步:pop factorial(1-1),返回1

2 * 1
3 * ??
4 * ??

第七步:pop factorial(2-1),返回2

3 * 2
4 * ??

第八步:pop factorial(3-1),返回6

4 * 6

第九步:pop factorial(4-1),返回24

整个递归函数执行完毕,得到结果24。

高洛峰

第二个代码叫递归,你的那个叫循环

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号