Python 的切片和递归
我在写一个小的递归代码时遇到了一些问题。我打印的输出结果看起来没问题,但当我试着加一个计数器来真正计算我的答案时,却出现了作用域错误。
total = 0
def foo(me, t):
if t<0:
return
if t==0:
total = total+1
return
for i in range(1, me+1):
total = total+1
return foo(i, t-i)
错误提示说在赋值之前引用了局部变量,其实我在第一行就想引用总数……这跟全局变量无关,我也试过用全局变量,但还是没用。
这完全是作用域的问题,有什么想法吗?
5 个回答
1
我不太确定你是否真的明白你想要做什么……
(至少如果你说加上 global 关键字会导致错误结果,但又能消除错误的话)
如果你想引用 total 这个变量,你确实需要写“global total”。
(你执行 foo(99, 100) 的时候期待得到什么结果呢?)
也许你的边界条件设置得不对?
因为用参数(99, 100)来调用时:
- foo 会跳过两个 if 语句
- 然后进入下面的循环:
for i in range(1, 100):
total += 1
return foo(i, 100-i)
这实际上等同于
else:
total += 1
return foo(1, 99)
(就像 Svante 说的那样)
根据你设置的两个 if 条件,foo(1, 99) 会正确地让 total 增加 100
(它会执行你的“else”语句 99 次,把 total 增加到 100,然后最后会到达 t == 0,执行最后一个 if,把 total 推到你认为的“错误”值 101)
你在第二种情况下也应该使用elif。
1
你忘了在你的函数里把 total 设置为全局变量。你说“我也试过使用 global,但没成功。”但是我在下面试的时候并没有出现任何错误:
total = 0
def foo(me, t):
global total
if t<0:
return
if t==0:
total = total+1
return
for i in range(1, me+1):
total = total+1
return foo(i, t-i)
2
正如其他人提到的,你需要使用 global
这个关键词来声明 total。此外,正如 Svante 所指出的,代码中的 for
循环其实是多余的,因为 i
始终是 1
。所以,看看你代码的一个等效版本:
total = 0
def foo(me, t):
global total
if t < 0:
return
total = total + 1
if t == 0:
return
return foo(1, t-1)
foo(99, 100)
print total
这样就更容易理解了,调用 foo(99, 100) 的结果确实是 101,因为你实际上是从 100 倒数到 0。我不太明白你为什么会有不同的想法呢?