Python汉诺塔递归函数中全局计数器计数异常问题求助
问题根因
- 你对汉诺塔的计数时机判断错误:只有实际执行盘子移动操作的步骤才需要计数,对应代码中两条移动打印语句的位置,函数递归进入的动作不属于有效步骤,不应该触发计数器递增。
- 原代码在
else分支开头就执行了count += 1,这部分是多余计数:此时还没有执行任何移动操作,提前加1后,后续递归调用tower(n-1)的过程中还会持续修改全局count的值,等递归返回上层执行大盘移动的打印语句时,count已经被递归内部的操作修改过,就会出现序号重复、跳号的问题。
修正后的代码
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) # 仅在实际移动当前n号盘前计数 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到31(n=5时总移动次数为2^5-1=31),不会出现重复、跳号问题。
内容的提问来源于stack exchange,提问作者Conrado Pellegrini
相关产品推荐
相关产品推荐

