递归函数追加numpy矩阵后列表全为最终矩阵?汉诺塔实现遇问题
问题原因
你遇到的问题核心是numpy数组属于可变对象。当你把m追加到m_list时,并没有保存当前状态的独立副本,而是存入了指向同一个数组的引用。后续对m的所有修改都会同步反映在列表中所有引用该数组的位置,最终导致列表里全是最后一步的矩阵状态。
解决方法
每次保存状态时,需要添加数组的副本而非原数组引用。numpy提供了copy()方法来创建数组的独立副本,这样列表中的每个元素都会对应汉诺塔移动过程中某一步的快照状态。
修改后的代码
import numpy as np def set_up(total,start): global moves moves = 0 m = np.empty((3,total+1)) for i in range(3): for j in range(total+1): m[i,j] = -1 for i in range(total): m[start,i] = int(total-i-1) m_list = [m.copy()] # 保存初始状态的副本 return m,m_list def move_disk(total,num,m,move_from,move_to,m_list): global moves temp =m[move_from,np.where(m[move_from]==-1)[0][0]-1] m[move_from,np.where(m[move_from]==-1)[0][0]-1]= -1 m[move_to,np.where(m[move_to]==-1)[0][0]] = temp moves = moves + 1 m_list.append(m.copy()) # 保存当前状态的副本 def towers_algorithm(total,num,m,start,middle,final,m_list): if num == 0: return else: towers_algorithm(total,num-1,m,start,final,middle,m_list) move_disk(total,num,m,start,final,m_list) towers_algorithm(total,num-1,m,middle,start,final,m_list)
验证说明
修改后,每次调用move_disk时都会将当前m的独立副本加入列表,列表中的每个元素都是互不影响的数组,分别对应汉诺塔移动过程中的每一步状态,不会再出现全部是最终矩阵的情况。
内容的提问来源于stack exchange,提问作者Syd Stafferton
相关产品推荐
相关产品推荐

