递归汉诺塔模拟函数中列表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
相关产品推荐
相关产品推荐

