日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汉诺塔的移动次数和移动过程

發布時間:2024/5/8 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉诺塔的移动次数和移动过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

有三根柱子 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) 次,分三個步驟完成:

  • nnn 個盤上的 n?1n-1n?1 個盤子借助 C 柱 從 A 柱移動到 B柱,需要 g(n-1) 次
  • 將第 nnn 個盤從 A 柱移動到 C 柱 ,需要移動 1 次
  • 將 B 柱上的 n?1n-1n?1 個盤借助 A 柱 移動到 C 柱,需要 g(n-1)次
    綜上所述,遞歸關系為:
    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 時, 分三步:

  • nnn 個盤上的 n?1n-1n?1 個盤子借助 C 柱 從 A 柱移動到 B柱,即 hn(n-1,a,c,b)
  • 將第 nnn 個盤從 A 柱移動到 C 柱 ,mv(a,c)
  • 將 B 柱上的 n?1n-1n?1 個盤借助 A 柱 移動到 C 柱,hn(n-1,b,a,c)
  • 程序源代碼

    #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;}

    總結

    以上是生活随笔為你收集整理的汉诺塔的移动次数和移动过程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。