今天玩游戏,8层的汉诺塔限时,玩不出来。于是我找了下网上的代码,大概是这样的
void hanoi(int n, char x, char y, char z) {
if (n == 1) {
cout << x << " --> " << z << endl;
}else {
//现将n-1 个由 x 移到 y
hanoi(n - 1, x, z, y);
//再将 第n个移到由x 移到 z
cout << x << " --> " << z << endl;
//最后将n-1个 由y移到z
hanoi(n - 1, y, x, z);
}
}
这个代码逻辑很简单,运用递归的方法实现的。
初看这代码也没得问题啊,可以仔细一瞧。
这递归什么时候结束啊?
在每个子式子,如果运行到 "if(n == 1):" 这部分就不会再递归调用了,如果运行到“else:”,就会调用hanoi(n-1),
那么问题来了会不会出现 一直是 else呢,当然会啦,
如果初始 n<=0,不就永远走不到 if(n==1)这一步了嘛。所以这代码还需界定n的取值。
当然还有用python写的。
def hanoi(n, x, y, z):
if n == 1:
print(x,'-->', z) #当只有一个时候直接 x - > z
else:
hanoi(n-1,x,z,y) #要将n-1 个先移到 y
print(x,'-->',z)
hanoi(n-1,y,x,z) #再将n-1 从y移到z上
在这段代码中除了要限定取值范围,还应该限制n的数据类型。
举个栗子:当n为浮点数,这不就出错了嘛。