You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归汉诺塔模拟函数中列表hlist被重置的问题修复咨询

修正汉诺塔递归函数的步骤丢失问题

哈哈,这个问题我太熟了!你遇到的核心问题就是每次递归调用playHanoi时,都会重新创建一个空的hlist,之前递归产生的步骤根本没被保留下来,最后自然只返回最底层n=1时的那一步。下面给你两种靠谱的修正方案:

方案一:通过参数传递共享同一个列表

我们可以把hlist作为可选参数传入函数,让所有递归调用共享同一个列表对象,这样就不会每次重置了:

def playHanoi(p1,p2,p3,n, hlist=None):
    # 第一次调用时初始化空列表
    if hlist is None:
        hlist = []
    if n==1:
        hlist.append([p1,p3])
    else:
        # 递归调用时传递同一个hlist
        playHanoi(p1,p3,p2,n-1, hlist)
        hlist.append([p1,p3])
        playHanoi(p2,p1,p3,n-1, hlist)
    return hlist

调用的时候直接传参数就行,比如playHanoi(1,2,3,3),会返回完整的移动步骤:[[1,3], [1,2], [3,2], [1,3], [2,1], [2,3], [1,3]]。

方案二:收集递归返回的结果并合并

如果不想修改函数参数,也可以把每次递归调用返回的列表结果合并到当前的hlist里,用extend方法把递归的步骤都加进来:

def playHanoi(p1,p2,p3,n):
    hlist=[]
    if n==1:
        hlist.append([p1,p3])
    else:
        # 把第一步递归的所有步骤合并到hlist
        hlist.extend(playHanoi(p1,p3,p2,n-1))
        hlist.append([p1,p3])
        # 把第三步递归的所有步骤合并到hlist
        hlist.extend(playHanoi(p2,p1,p3,n-1))
    return hlist

这个方案里,每次递归调用都会返回对应子问题的步骤列表,我们用extend把这些列表的元素全部添加到当前的hlist中,这样最终就能得到完整的移动序列了。

内容的提问来源于stack exchange,提问作者Jrb097

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:02:02