畅谈递归之怀疑人生。(请知道汉诺塔的大佬进入)
  • 板块灌水区
  • 楼主LuffyLuo
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/4/10 11:33
  • 上次更新2023/11/5 00:47:03
查看原帖
畅谈递归之怀疑人生。(请知道汉诺塔的大佬进入)
443739
LuffyLuo楼主2021/4/10 11:33

我是一个蒟蒻,我想知道知道,了解了解,各位路过的大佬对递归在计算机中的运算过程,让我们引入一道题,来看看。

汉诺塔问题(匹诺曹问题

输入一个正整数n,求n阶汉诺塔最少移动方案。(即将A上的碟子,放到C上(总共只有ABC三个棍子))

底下是本人代码:

#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char c,char b){
	if(n==1) printf("%c-%d->%c\n",a,n,c);
	else{
		hanoi(n-1,a,b,c);
		printf("%c-%d->%c\n",a,n,c);
		hanoi(n-1,b,c,a);
	}
}
int main(){
	int n;char a='A',b='B',c='C';
	scanf("%d",&n);
	hanoi(n,a,c,b);
	return 0;
}

但我看这个代码,觉得输出的肯定是A-1->C,但如果输入4,答案是A-1->B。所以我用了最传统的方法去判断,如下:

#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char c,char b){
	if(n==1) printf("%c-%d->%c\n",a,n,c);
	else{
		cout<<a<<' '<<b<<' '<<c<<endl; 
		hanoi(n-1,a,b,c);
		printf("%c-%d->%c\n",a,n,c);
		hanoi(n-1,b,c,a);
	}
}
int main(){
	int n;char a='A',b='B',c='C';
	scanf("%d",&n);
	hanoi(n,a,c,b);
	return 0;
}

发现输入4时,答案为:

3
A B C
A C B
A-1->C
A-2->B
C-1->B
A-3->C
B A C
B-1->A
B-2->C
A-1->C

我惊奇的发现我函数中的ABC在不断变化,吓得我一阵慌,希望各位大佬给我解解忧!!!

2021/4/10 11:33
加载中...