汉诺塔的移动次数和移动过程
生活随笔
收集整理的這篇文章主要介紹了
汉诺塔的移动次数和移动过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
有三根柱子 A B C ,A柱上有 nnn 個圓盤,最大的一個在底下,其余一個比一個小,依次疊上去。將所有在 A 上的圓盤移動到 C ,小盤只能在大盤上面。
計算移動次數
當 n=1n =1n=1 時,A->C 移動一次
當 n=2n=2n=2 時 ,A->B , A->C , B->C, 移動三次
當 n=3n=3n=3 時 ,A ->C , A->B , C->B , A->C , B->A , B->C , A->C , 移動七次
設移動 nnn 個盤需要移動 g(n) 次,分三個步驟完成:
綜上所述,遞歸關系為:
g(n)=2g(n?1)+1g(n) = 2g(n-1) + 1 g(n)=2g(n?1)+1
初始條件為: g(1)=1g(1) = 1g(1)=1
程序源代碼
#include<stdio.h> double g(int n){double s;if(n == 1)s = 1;elses = 2*g(n-1)+1;return s; } int main(){int n;printf("請輸入盤片數n:");scanf("%d",&n);if(n<=40)printf("%d盤的移動次數為:%0.0f\n",n,g(n));elseprintf("%d盤的移動次數為:%.4e\n",n,g(n));return 0;}移動過程
設遞歸函數 hn(int n,char a,char b,char c) 表示把 n 個盤從 A 柱 借助 B 柱 移動到 C 柱的過程, 函數 mv(char x,char y) 表示 X -> Y
當 n = 1 時,mv(a,c)
當 n > 1 時, 分三步:
程序源代碼
#include<stdio.h> int k = 0; void mv(char x,char y){printf("%c --> %c\t",x,y);k++;if(k % 5 == 0)printf("\n"); }void hn(int n,char a,char b,char c){if(n == 1)mv(a,c);else{hn(n-1,a,c,b);mv(a,c);hn(n-1,b,a,c);} } int main(){int n;printf("請輸入盤片數n:");scanf("%d",&n); hn(n,'A','B','C');printf("\n總共移動的次數->%d",k);return 0;}總結
以上是生活随笔為你收集整理的汉诺塔的移动次数和移动过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详细的easyExcel填充数据填充图片
- 下一篇: 滑动关机--方便