1. 程式人生 > >第三週專案三-體驗複雜度2(漢諾塔問題)

第三週專案三-體驗複雜度2(漢諾塔問題)

/*
 *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),學習的過程中需要細心和耐心!