python递归中的return"陷阱"

时间:2021-03-11 22:39:07

在做一道练习题(参照下篇博文《在当前目录下递归的查找包含指定字符串的文件》)的时候,发现函数中的return的值竟然是None,百思不得其解,尝试化繁为简,用以下的简单的代码验证了一下

问题版本代码:为什么return i 返回的是 i , 而print(i)得到的是 0

def func(i):
    if i == 0:
        print(i)
        return i
    elif i > -2:
        i = i-1
        func(i)

print(func(3))

运行结果:
0
None

如果把递归过程画成流程图,或许更容易理解一些

case1: 有递归的情况

python递归中的return"陷阱"

case2: 无递归的情况

python递归中的return"陷阱"

错误的解决方案:

def func(i):
    if i == 0:
        print(i)
        return i
    elif i > -2:
        i = i-1
        func(i)
        return(i)

print(func(3))

运行结果:
0

仍然图解一下,更直观

python递归中的return"陷阱"

正确的解决方案一:

def func(i):
    if i == 0:
        print(i)
        return i
    elif i > -2:
        i = i-1
        return(func(i))

print(func(3))

运行结果:
0
0

python递归中的return"陷阱"

正确的解决方案二:

result = None
def func(i):
    if i == 0:
        print(i)
        global result
        result = i
    elif i > -2:
        i = i-1
        func(i)
    return result

print(func(3))

运行结果:
0
0

python递归中的return"陷阱"

参考文章

https://www.cnblogs.com/yechenkai/p/7143475.html

https://www.cnblogs.com/lincappu/p/8146141.html