ハノイタワー問題
まずこの問題についてネット上で2種類のコードがあって、答えはすべて同じです
第1種
n個の円盤を一つの柱(StartTower)から別の柱(EndTower)に運び、テーマの要件を満たすには、空き柱(SpareTower)を借りる必要がある.n個の円盤の移動を実現するのは容易ではないので、角度を変えて考えることができて、n個の円盤を1個と(n-1)個の円盤に分けることができます;この(n-1)個の円盤はすでに順序を並べて、3本の柱を利用して簡単にこの2組の円盤を1つの柱から別の柱に移動することができます.更に(n-1)個の円盤を1個の円盤と(n-2)個に分けることができます....各問題は前の問題と類似しており,規模が徐々に縮小しており,再帰的な方法で記述することが考えられる.
第2種
2つのコードの間に私が***記号を打たれた違いを考え始めました.なぜ彼らの効果は同じなのか、再帰の本質を考え始めました.
第1種
#include
#include
using namespace std;
int towers(int size,char f,char t,char s){ // f startTower,t spareTower,s endTower
static int count=0;
if (size==1){
cout<
n個の円盤を一つの柱(StartTower)から別の柱(EndTower)に運び、テーマの要件を満たすには、空き柱(SpareTower)を借りる必要がある.n個の円盤の移動を実現するのは容易ではないので、角度を変えて考えることができて、n個の円盤を1個と(n-1)個の円盤に分けることができます;この(n-1)個の円盤はすでに順序を並べて、3本の柱を利用して簡単にこの2組の円盤を1つの柱から別の柱に移動することができます.更に(n-1)個の円盤を1個の円盤と(n-2)個に分けることができます....各問題は前の問題と類似しており,規模が徐々に縮小しており,再帰的な方法で記述することが考えられる.
第2種
move(x, y) { printf(\t%c-->%c
",x,y);
}
voidhannuota(intn, chara, charb, charc) // hannuota , a,b,c ,
{
if(n == 1)
move(a, c); // move
else
{
hannuota(n-1, a, c, b); //
move(a, c); // move//***
hannuota(n-1, b, a, c); //
}
}
intmain(void)
{
intn;
printf(" :
");
scanf("%d",& n);
hannuota(n, 'a', 'b', 'c');
return0;
}
/* : n = 3
n = 3 n = 2 n = 1
| |h(1, a, b, c)=>move(a, c)=> a->c //1
|h(2, a, c, b) |move(a, b) a->b //2
| |h(1, c, a, b)=>move(c, b)=> c->b //3
|
h(3, a, b, c) |move(a, c) a->c //4
|
| |h(1, b, c, a)=>move(b, a)=> b->a //5
|h(2, b, a, c) |move(b, c) b->c //6
| |h(1, a, b, c)=>move(a, c)=> a->c //7
|
:
:
3
a-->c
a-->b
c-->b
a-->c
b-->a
b-->c
a-->c
*/
2つのコードの間に私が***記号を打たれた違いを考え始めました.なぜ彼らの効果は同じなのか、再帰の本質を考え始めました.