漢諾塔的問題解決如下:
1)如果有乙個盤子,直接從a移到c即可。
2)如果有n個盤子要從a移到c,b作為輔助。問題可以轉化為,先將上面n-1個從a移動到b,c作為輔助,然後將第n個從a移動到c,最後將剩餘的n-1個從b移動到c,a作為輔助。
假設圓盤的個數為n,圓盤編號從上到下依次為1,2,3,4,……n,證明如下
①當 n = 1 時,從 a 移動到 c 顯然能夠完成,設需要移動的次數是a1,此時顯然a1等於1.
②當 n = 2 時,由①可知從把 1 號盤子從 a 移動到 b能夠完成(b 和 c 是等效的)此時移動次數為a1。
之後把2號盤子移動到c上面此時移動次數為a1 + 1。
這時把1號盤子從b移動到c和①是等價的,
移動後總的移動次數是a2 = a1 + 1 + a1。
③當n = 3時,由②可知移動成下圖的效果是可以實現的,
此時移動的次數是a2,接著把3號盤子移動到c上面
此時移動的次數是a2 + 1,這時把1和2號盤子移動到c上面(移動過程中3號盤子始終不會動)和②等效的,移動完成之後如下
移動的總次數是a3 = a2 + 1 + a2
④當n=4時,由③可知移動成下圖的效果是可以實現的,
此時移動的次數是a3
把4號盤子從a移動到c
此時移動的次數是a3 + 1
接下來把123號盤子從b移動到c的過程又和③等效了移動之後如下
移動的總次數是a4 = a3 + 1 + a3
假設當n= k時,從a移動到c是可以實現的,那麼當n=k+1時,可以移動到a上面只剩k+1號盤子,b上面依次是1,2,3,.....,k號盤字,此時移動次數是ak
把k+1號盤子移動到c上面,這時移動次數是ak + 1
接下來和n=k時移動過程等效,移動完成後移動總次數是ak+1 = ak + 1+ ak
可以得知移動k+1個盤子需要的次數與移動k個盤子的次數之間的關係是:
ak+1 = ak + 1+ ak = 2ak + 1
所以ak+1 + 1 = 2*(ak + 1)【這是個等比數列高中學過的】
即ak + 1 = (a1 +1)* 2n-1 = 2n 因此ak = 2n - 1
至此,證明完畢。
不完全型別
c 允許在乙個 檔案中存放多個類,但這樣往往不便於類的管理,所以一向是提倡乙個檔案中只存放乙個類。不過呢,隨著類規模的不斷膨脹,乙個檔案中存放乙個類也有些顯得臃腫,或者是在某個角度上不便於 的組織。因此,c 2.0中引入了不完全型別的概念,即啟用了新的修飾符partial。借助該修飾符,我們可以在多...
不完全型別
不完全型別指 函式之外 型別的大小不能被確定的型別 總結一下,c的型別分為 結構體的宣告就是乙個不完全型別的典型例子。struct woman tag struct man tag struct woman tag 這樣是沒問題的。如果將man tag結構中的struct woman tag wif...
不完全型別
有時候我們在一些編譯器寫 的時候會碰見不完全型別這個編譯錯誤,那麼什麼是不完全型別,為啥會出現呢 不完全型別指 函式之外 型別的大小不能被確定的型別 只能以有限方式使用。不能定義該型別的物件。不完全型別只能用於定義指向該型別的指標及引用 1 或者用於宣告使用該型別作為形參型別或者返回值型別。c的型別...