ハノイタワー問題


まずこの問題についてネット上で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つのコードの間に私が***記号を打たれた違いを考え始めました.なぜ彼らの効果は同じなのか、再帰の本質を考え始めました.