第2周 項目3-體驗複雜度

/*
*Copyright(c)2015級,煙臺大學 計算機與控制工程學院

*All right reserved.
*文件名稱:text.cpp
*作者:樑凱
*完成日期;2016.9.18
  *版本號;v1.0
  *
  *問題描述:有一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插着三根寶石針。
印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。
不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,
  小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,
而梵塔、廟宇和衆生也都將同歸於盡。可以算法出,當盤子數爲n個時,需要移動的次數是f(n)=2n?1。n=64時,假如每秒鐘移一次,共需要18446744073709551615秒。
一個平年365天有31536000秒,閏年366天有31622400秒,平均每年31556952秒,移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,
太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。
據此,2n從數量級上看大得不得了。
   用遞歸算法求解漢諾塔問題,其複雜度可以求得爲O(2n),是指數級的算法。體驗盤子數discCount爲4、8、16、20、24時在時間耗費上的差異.
*程序輸出:無 .

*/ 

.#include <stdio.h> 
 #define discCount 31 
 long move(int, char, char,char); 
 int main() 
 { 
   long count; 
    count=move(discCount,'A','B','C'); 
     printf("%d個盤子需要移動%ld次\n", discCount, count); 
     return 0; 
 } 
  
 long move(int n, char A, char B,char C) 
 { 

     long c1,c2; 
     if(n==1) 
         return 1; 
     else 
     { 
        c1=move(n-1,A,C,B); 
        c2=move(n-1,B,A,C); 
        return c1+c2+1; 
    } 
 } 

 

運行結果:

心得:

在反覆的運用中用實踐來檢驗學過的知識。感覺用起來不錯,挺方便的。

知識點總結:

重溫遞歸的運用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章