在为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
任何帮助理解此内容或关键字以更好地帮助搜索参考的人,将不胜感激。
答案 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_func
都n
被本地化,则递归将失去其意义。