第三週專案三-體驗複雜度2(漢諾塔問題)
阿新 • • 發佈:2019-02-10
/*
*Copyright (c) 2017, 煙臺大學計算機學院
*All rights reserved.
*檔名稱:zha.cpp
*作者:張思琦
*完成日期:2017年9月13日 *版 本 號:v1.0 * *問題描述:漢諾塔問題(計算移動n個盤子需要移動的次數) *輸入描述:盤子數目n *程式輸出:見程式執行截圖 */ #include <stdio.h> #define discCount 32 long long move(long long, char, char,char); int main() { long long count; count=move(discCount,'A','B','C'); printf("%d個盤子需要移動%I64d次\n", discCount, count); return 0; } long long move(long long n, char A, char B,char C) { long 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; } }
因為盤子需要移動的次數實在太大了,它超過了32位整形數所能表示的資料範圍(32位整形數所能表示的最大數是2147483647,這個數剛好是盤子數為31時所需要移動的次數!所以當盤子數為32時再用32位整形數就不行了。
知識點總結:
使用了遞迴的思想,雖然遞迴思想在有些時候不是很好理解,但它的應用卻是非常廣泛的!
學習心得:
遞迴是一個很有趣的方法,有許多地方都會用到遞迴(比如DFS),學習的過程中需要細心和耐心!