网上常见汉诺塔问题代码的bug

今天玩游戏,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为浮点数,这不就出错了嘛。

你可能感兴趣的:(网上常见汉诺塔问题代码的bug)