每篇一句:
Promises are often like the butterfly, which disappear after beautiful hover.
递归函数:
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是 递归函数 。
递归函数可以简化我们的代码,但是递归函数的 返回值 有时候会出现一些意想不到的问题。
- 先来看以下一段代码:
def fun(i):
# 函数内部i+1,期望返回值为5
i += 1
if i < 5:
fun(i)
else:
return i
result = fun(0)
print result
乍一看上去,函数fun()并没有什么问题,让我们运行一下:
# C:\Python27\python.exe C:/Users/14344/Desktop/demo.py
# None
我们发现函数的 返回值 为 None ,运行效果并不是我们期望的 5 。
函数调用中的堆栈使用
要搞清楚这个问题,我们需要了解 函数调用过程中堆栈是如何使用的 。由于博主自己对函数调用理解的不是很透彻,所以还是推荐大家去阅读一下别人对这方面的相关介绍。以下是几篇相关博客,感觉讲的挺好:
问题解决:
简单了解了 函数调用中的堆栈使用 之后,我们来简单分析一下上述代码的执行过程,如下图:
- 首先执行fun(0),然后依次是fun(1),fun(2),fun(3),fun(4),在fun(3)中,i 满足i < 5,进入fun(4),在if语句暂停,fun(4)返回值为5,返回fun(3)中,fun(3)接着执行,但没有执行到return语句,所以fun(3)返回值为None,同理:fun(2),fun(1),fun(0)也都没有执行到return语句,所以最终返回值为 None 。
了解了代码的执行过程,现对代码做出如下修改:
def fun(i):
# 将 if 语句中的fun(i) 改为 return fun(i)
i += 1
if i < 5:
return fun(i)
else:
return i
再来运行一下:
# C:\Python27\python.exe C:/Users/14344/Desktop/demo.py
# 5
结果正确,返回值为我们的期望值 5 。
简单分析一下:
- 函数调用顺序不变,依然为: fun(0),fun(1),fun(2),fun(3),fun(4),不同的是fun(4)返回值为5,然后返回fun(3)中执行,fun(3)紧接着也将5返回,同理:fun(2),fun(1),fun(0) 也紧接着将5返回,所以最终返回值为5。
最后:
本文只是简单的分析了一下 递归函数返回值为None 的问题,文中所给代码并没有什么具体意义,但 解决办法的思路就是:使每次递归都要能够执行到return语句 。
各位读者在实际中遇到这种情况的话,还需根据具体情况思考合适的解决方式。