漢諾塔、反向輸出問題--利用遞歸實現

1.  Hanoi問題

  一塊板上有A、B和C3根針。A針上套有64個大小不等的圓盤,大的在下,小的在上。要把這64個圓盤從A針移動到C針上,每次只能移動一個圓盤,移動可以藉助B針進行。但在任何時候,每個鎮上的圓盤都必須保持大盤在下,小盤在上,求移動的步驟。

  本算法分析如下,設A上有n個盤子。

  如果n=1,則將圓盤從A直接移動到C。

  如果n=2,則

(1)將A上的n-1(等於1)個圓盤移動到B上;

(2)再將A上的一個圓盤移動到C上;

(3)最後將B上的n-1(等於1)個圓盤移動到C上。

  如果n=3,則

(1)將A上的n-1(等於2,令其爲m)個圓盤移動到B(藉助於C)上,步驟如下:

A.將A上的m-1(等於1)個圓盤移動到C上;

B.將A上的一個圓盤移動到B上;

C.將C上的m-1(等於1)個圓盤移動到B上;

(2)將A上的一個圓盤移到C上;

(3)將B上的n-1(等於2,令其爲m)個圓盤移動到C(藉助A)上,步驟如下:

A.將B上m-1(等於1)個圓盤移到A上;

B.將B上的一個圓盤移到C上;

C.將A上的n-1(等於1)個圓盤移到C上;

由此,完成了3個圓盤的移動過程。

從以上分析可知,當n大於2時,移動的過程可分解爲3個步驟:

第一步 把A上的n-1個圓盤移到B上

第二步 把A上的一個圓盤移到C上

第三步 把B上的n-1個圓盤移動到C上,其中第一步和第三步的操作方法類似。

#include<stdio.h>
move(int n,int x,int y,int z){
 if(n==1)
  printf("%c-->%c  ",x,z);
 else{
  move(n-1,x,z,y);
  printf("%c-->%c  ",x,z);
  move(n-1,y,x,z);
 }
}
main(){
 int h;
 printf("/ninput number:/n");
 scanf("%d",&h);
 printf("the step to moving %2d diskes:/n",h);
 move(h,'a','b','c');
 printf("/n");
}

2.  反序輸出問題

反向輸出一組整數

#include<stdio.h>
void reverse();
main(){
 printf("運行結果爲:/n");
 printf("輸入一組整數(以0結束):/n");
 reverse();
 printf("/n");
}
void reverse(){
 int n;
 scanf("%d",&n);
 if(n!=0){
  reverse();
  printf("%-4d",n);
 }
 else
  printf("/n輸出一組反序數/n");
}

發佈了48 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章