Python 的切片和递归

1 投票
5 回答
1554 浏览
提问于 2025-04-15 13:38

我在写一个小的递归代码时遇到了一些问题。我打印的输出结果看起来没问题,但当我试着加一个计数器来真正计算我的答案时,却出现了作用域错误。

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)来调用时:

  1. foo 会跳过两个 if 语句
  2. 然后进入下面的循环:

  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。我不太明白你为什么会有不同的想法呢?

撰写回答