python - 递归函数内的全局计数

标签 python

我观看了有关汉诺塔的视频,并按照说明创建了解决该问题的脚本。代码运行得很好,但我想在函数中添加一个计数器,以便我可以使用索引打印每个步骤,以便后续操作。
我尝试使用全局变量来计算递归函数被调用的次数,并使用这个计数作为我的索引,但仍然无法让它正常工作......我在这里做错了什么?

count = 0


def tower(n, start, end, middle):
    global count
    if n == 1:
        count += 1
        print('%i - Coloque o disco %i do pino %s no pino %s' % (count, n, start, end))
    else:
        count += 1
        tower(n - 1, start, middle, end)
        print('%i - Coloque o disco %i do pino %s no pino %s' % (count, n, start, end))
        tower(n - 1, middle, end, start)


tower(5, 'A', 'C', 'B')

现在输出是这样的:

5 - Coloque o disco 1 do pino A no pino C
5 - Coloque o disco 2 do pino A no pino B
6 - Coloque o disco 1 do pino C no pino B
6 - Coloque o disco 3 do pino A no pino C
8 - Coloque o disco 1 do pino B no pino A
8 - Coloque o disco 2 do pino B no pino C
9 - Coloque o disco 1 do pino A no pino C
9 - Coloque o disco 4 do pino A no pino B
12 - Coloque o disco 1 do pino C no pino B
12 - Coloque o disco 2 do pino C no pino A
13 - Coloque o disco 1 do pino B no pino A
13 - Coloque o disco 3 do pino C no pino B
15 - Coloque o disco 1 do pino A no pino C
15 - Coloque o disco 2 do pino A no pino B
16 - Coloque o disco 1 do pino C no pino B
16 - Coloque o disco 5 do pino A no pino C
20 - Coloque o disco 1 do pino B no pino A
20 - Coloque o disco 2 do pino B no pino C
21 - Coloque o disco 1 do pino A no pino C
21 - Coloque o disco 3 do pino B no pino A
23 - Coloque o disco 1 do pino C no pino B
23 - Coloque o disco 2 do pino C no pino A
24 - Coloque o disco 1 do pino B no pino A
24 - Coloque o disco 4 do pino B no pino C
27 - Coloque o disco 1 do pino A no pino C

有人可以解释一下为什么计数器没有按照我预期的方式工作吗?

最佳答案

问题是,当你有 n == 1 时,你就开始打印东西,因为它是递归,但每次调用递归时你都会添加计数。

您可以通过将计数添加到 else 语句中的打印之前来解决此问题,如下所示:

count = 0


def tower(n, start, end, middle):
    global count
    if n == 1:
        count += 1
        print('%i - Coloque o disco %i do pino %s no pino %s' % (count, n, start, end))
    else:
        tower(n - 1, start, middle, end)
        count += 1
        print('%i - Coloque o disco %i do pino %s no pino %s' % (count, n, start, end))
        tower(n - 1, middle, end, start)


tower(5, 'A', 'C', 'B')

它将输出如下:

1 - Coloque o disco 1 do pino A no pino C
2 - Coloque o disco 2 do pino A no pino B
3 - Coloque o disco 1 do pino C no pino B
4 - Coloque o disco 3 do pino A no pino C
5 - Coloque o disco 1 do pino B no pino A
6 - Coloque o disco 2 do pino B no pino C
7 - Coloque o disco 1 do pino A no pino C
8 - Coloque o disco 4 do pino A no pino B
9 - Coloque o disco 1 do pino C no pino B
10 - Coloque o disco 2 do pino C no pino A
11 - Coloque o disco 1 do pino B no pino A
12 - Coloque o disco 3 do pino C no pino B
13 - Coloque o disco 1 do pino A no pino C
14 - Coloque o disco 2 do pino A no pino B
15 - Coloque o disco 1 do pino C no pino B
16 - Coloque o disco 5 do pino A no pino C
17 - Coloque o disco 1 do pino B no pino A
18 - Coloque o disco 2 do pino B no pino C
19 - Coloque o disco 1 do pino A no pino C
20 - Coloque o disco 3 do pino B no pino A
21 - Coloque o disco 1 do pino C no pino B
22 - Coloque o disco 2 do pino C no pino A
23 - Coloque o disco 1 do pino B no pino A
24 - Coloque o disco 4 do pino B no pino C
25 - Coloque o disco 1 do pino A no pino C
26 - Coloque o disco 2 do pino A no pino B
27 - Coloque o disco 1 do pino C no pino B
28 - Coloque o disco 3 do pino A no pino C
29 - Coloque o disco 1 do pino B no pino A
30 - Coloque o disco 2 do pino B no pino C
31 - Coloque o disco 1 do pino A no pino C

关于python - 递归函数内的全局计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69668099/

相关文章:

python - 用第二个 DF 填充 DF

python - 将 Fernet key 写入文本文件会生成字节字符串而不是 ASCII 字符串

Python套接字一次接收多个数据包

python - 如何在 Python 中将复杂列表转换为字符串?

python - Pandas 将混合 float/int 类型列的 int 元素读取为 nan

python - Tweepy(Twitter API)不返回所有搜索结果

python - Android 应用程序数据库与远程数据库同步

python - 如何将嵌套列表中的值转换为集合?

python - time.strptime 得到 TypeError : function takes at most 8 arguments (9 given)

python - 我可以在 Tkinter 中注册更改事件的回调吗?