网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月06日
漏签
0
天
python吧
关注:
470,129
贴子:
1,953,832
看贴
图片
吧主推荐
视频
游戏
12
回复贴,共
1
页
<<返回python吧
>0< 加载中...
汉诺塔问题,为什么递归深度?
只看楼主
收藏
回复
清水鱼无间
贡士
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
汉诺塔问题,为什么超出递归深度?
数量为3时正常, 盘子超过4 就报错 超出递归深度。谢谢各位大佬
一周休七日
吧主
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
还有len(A)等于0的情况
清水鱼无间
贡士
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
加入 len(A)==0 也报错
凌晨
贡士
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
再试试呢
清水鱼无间
贡士
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
以下是官方答案,也能跑通
和我的程序有2点区别
1.答案定义了一个 move函数,用变量n=len(A)做递归条件, 为啥直接用len(a) 判断不行?
2.答案用C.append(A.pop()) 这个理解不了,不应该是A中最大的盘子移动到C,A中最大的盘子应该在最下面,是pop(0)啊, 不应该是pop()
3.其他的递归逻辑我看了, 顺序是一样的,没问题。。。 有哪位大佬可以解释下?
凌晨
贡士
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你的递归逻辑看起来是正确的,但是有几个可能的问题点:
1. 你可以直接使用 `len(A)` 作为递归条件,这没有问题。但在这个答案中,使用一个额外的变量 `n` 可能是为了代码的可读性,或者是为了减少在递归调用中多次计算 `len(A)`。
2. 在汉诺塔问题中,我们总是移动位于顶部的盘子,而不是最大的盘子。栈(list)在这里的使用就像一个真正的汉诺塔塔架,你只能取走最顶部的盘子。因此,`A.pop()` 是正确的,因为它移除并返回列表的最后一个元素,即位于顶部的盘子。
3. 如果其他的递归逻辑和官方答案一样,那么问题很可能出在如何处理列表操作上。在Python中,`list.pop()` 默认移除最后一个元素,这在汉诺塔问题中代表的是塔顶的盘子,而 `pop(0)` 会移除列表的第一个元素,这在汉诺塔中没有意义,因为你不能从底部开始移动盘子。
如果你的代码运行不正确,可能是因为你对栈的操作理解有误。在汉诺塔问题中,“栈”的顶部是列表的末尾。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示