Python中的嵌套递归函数流

时间:2018-09-03 02:47:52

标签: python-3.x recursion

在为Euler问题37解决一个比强力解决方案更好的解决方案时,我遇到了一个非常有效的嵌套递归算法。不幸的是,我无法完全理解逻辑流程。下面是剥离到核心概念的类似嵌套函数。

def print_func(n):
    print(n)

def nest_func(n):
    print_func(n)
    for cntn in range(1,6):
        n = n * 10 + cntn
        if n < 1000: nest_func(n)

for cnt in range(1,6):
    nest_func(cnt)

调试输出为:

1
11
111
112
2
21
211
212
3
... to 512

我不明白为什么调试输出不是:

1
11
111
112
113
114
115
12
121
122
123
124
125
13
...to 555

任何帮助理解此内容或关键字以更好地帮助搜索参考的人,将不胜感激。

2 个答案:

答案 0 :(得分:0)

自己写出执行过程即可明白

def nest_func(n):     print_func(n)#1     对于范围(1,6)中的cntn:#n = 1         n = n * 10 + cntn#n = 11         如果n <1000:nest_func(n)#n = 11             def nest_func(n):#n = 11这是第一次递归                 print_func(n)#11返回输出112                 对于范围(1,6)中的cntn:#n = 11                     n = n * 10 + cntn#n = 111#n = 112                     如果n <1000:nest_func(n)#n = 111                         def nest_func(n):#n = 111这是第二次递归                             print_func(n)#111                             for cntn in range(1,6):#n = 111到这里就不再往下执行                                 n = n * 10 + cntn#n = 111                                 如果n <1000:nest_func(n)#n = 111

答案 1 :(得分:0)

这是由于format(x, '.2f') 是递归内的共享变量。如果您写n,则每次都更新n = n * 10 + cntn

如下所示,让代码稍作更改。

n

现在,输出应该是您期望的。 (或def print_func(n): print(n) def nest_func(n): print_func(n) for cntn in range(1,6): a = n * 10 + cntn if a < 1000: nest_func(a) for cnt in range(1,3): nest_func(cnt)


您的误解是每个nest_func(n * 10 + cntn)中的n不在同一范围内。但是不,这不是递归所要的。如果每个nest_funcn被本地化,则递归将失去其意义。