2014-03-05 429 views
1

你好每天都會在C語言中變得更好,這是我的課本中出現的一個例子,它產生斐波那契數字並顯示遞歸函數。該程序的作品,但我只是不明白如何...具體在部分(looper % 5),整個功能fibprintf(", %8ld", fib(looper));正在做什麼。它是否像說fib()做x次。如果這個問題不容易解釋,那麼有人可以讓我更容易理解遞歸函數如何在「河內塔」的例子中工作。謝謝。 注意:程序意圖處理多達30個數字,其他人明智地看起來很醜。C關於遞歸函數的說明

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 

long fib (long num); 

int main(void) 
{ 
    int seriesSize; 

    printf("This program will print out a Fibonacci series.\n"); 
    printf("How many many numers do you wnat? "); 

    scanf_s("%d", &seriesSize); 

    printf("First %d Fib numbers: \n", seriesSize); 
    for (int looper = 0; looper < seriesSize; looper++) 
    { 
     if (looper % 5) 
     { 
      printf(", %8ld", fib(looper)); 
     } 
     else 
     { 
      printf("\n%8ld", fib(looper)); 
     } 
    } 
    printf("\n"); 
    return 0; 
} 

long fib(long num) 
{ 
    if (num == 0 || num == 1) 
    { 
     return num; 
    } 
    return (fib(num - 1) + fib(num - 2)); 
} 
+1

'if(looper%5)'只是幫助格式化輸出,使用'「,」'或'「\ n」'分隔值。 –

+0

哦回顧我現在看到的程序,它只是在四條線上添加「,」。即1..4%5 =「,」和5%5 = 10。 %有時會令人困惑.... 謝謝。 –

回答

1

背後的long fib(long num)功能的想法是,它反映在於其本身來定義的斐波納契序列的天然定義。也就是說,fib(n)由fib(n-1)和fib(n-2)定義。例如,fib(5)是fib(4)+ fib(3)。

教科書以上述遞歸方式編寫了函數。請注意,這不是實現斐波納契函數的最有效方式,但它在邏輯上合理。

爲了理解它,通過示例輸入來追蹤其執行情況是值得的。以fib(3)爲例。第一個if聲明不會觸發,因爲num不是0或1.因此,它計算出fib(2)和fib(1)是什麼,並將它們相加。我們知道fib(1)做了什麼 - 它在第一個if語句中返回1。以類似的方式跟蹤fib(2),你會發現它返回1.因此,fib(3)將返回fib(2)+ fib(1)= 2。你可以進一步擴展 - 採取fib(4)。它會返回fib(3)+ fib(2),我們知道它是2和1,因此fib(4)= 3.

這種方法可以用於大多數遞歸函數 - 將其視爲創建新實例的fib()函數持續創建,直到它在最終情況下(在這種情況下爲num == 1或num == 0),然後返回,填充答案,直到返回到你開始的功能,與答案。

+0

好吧,我現在明白斐波那契數字的數學。感謝那個澄清。所以在fib()函數中,當long fib(long num)時,looper的值是如何進入函數的。那麼C中的函數足夠聰明,只需設置looper = num?沒有一個指針和不同的類型 - 因爲通常我會使用指針來做這樣的事情......如果是這樣的話,那真是太好了。我希望我的書在這件事上有更多的... –

+1

「fib」函數的原型需要一個名爲'num'的long類型的「參數」。在代碼中,它被稱爲:'fib(looper)'。這意味着無論Looper的當前值是什麼,它都會作爲第一個參數傳入'fib'函數並保存到'num'中。因此,當您與'fib()'內部的值進行交互時,您只需引用'num'變量。這意味着調用'fib'的代碼中的參數名稱無關緊要,變量將被放入'num'變量中,您可以使用它。便利! –

+0

太棒了!我正在玩功能來測試這一點,是的,它確實有效。感謝您的幫助。 –