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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汉诺塔问题详细解析zufeoj

發布時間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉诺塔问题详细解析zufeoj 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

漢諾塔(Tower of Hanoi),又稱河內塔,是一個源于印度古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。


漢諾塔分析

我們先從漢諾塔一層開始分析:我們有A、B、C三個塔。只有一層的時候,我們需要挪動的次數為1次

在二層的時候,我們首先將盤1挪到B塔,再將盤2挪到C盤,最后將盤1挪到盤1上。總共需要1+1+1=3步。

在三層的時候,我們首先將盤1和盤2挪到B塔,再將盤3挪到C盤,最后將盤1和盤2挪到盤3上。當然挪動盤1和盤2的時候并不是一步就完成的,我們觀察二層時的步數可以發現,挪動盤1和盤2需要3步。所以我們在3層時總共需要3+1+3=7步。

同理,在四層的時候,我們首先將盤1、盤2和盤3挪到B塔,再將盤4挪到C盤,最后將盤1、盤2和盤3挪到盤4上。我們觀察三層時的步數可以發現,挪動盤1、盤2和盤3需要7步。所以我們在4層時總共需要7+1+7=15步。


總結

我們在對漢諾塔分析之后發現,每層挪動的步數,都是看上一層的步數累加起來的,即Sn=Sn-1+1+Sn-1,化簡得Sn=2Sn-1+1。這就是漢諾塔著名的的遞推公式。

由此,我們以遞歸方法計算漢諾塔問題時,代碼如下

#include<stdio.h> int sum; int hanoi(int n, char A, char B, char C) {if (n == 0)return 0;hanoi(n - 1, A, C, B);//將n-1個盤子由A經過C移動到Bprintf ("step %d: move %d from %c->%c\n", sum++, n, A, C);hanoi(n - 1, B, A, C);//剩下的n-1盤子,由B經過A移動到C }int main() {int n;scanf ("%d", &n);sum=1;hanoi(n, 'A', 'B', 'C');printf ("總共%d步\n", sum-1);return 0; }

當然,我們在了解漢諾塔的規律之后,就有了更加簡單的方法來計算步數。代碼如下:

#include<stdio.h> int main(){int sum=1,n,i;scanf("%d",&n);for(i=1;i<n;i++){sum=sum*2+1;}printf("%d",sum); }

有時候弄懂問題背后的數學邏輯,編程可以變得簡單到難以置信hhh :)

?

?

?

總結

以上是生活随笔為你收集整理的汉诺塔问题详细解析zufeoj的全部內容,希望文章能夠幫你解決所遇到的問題。

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