2016-08-29 69 views
-5
#include <stdio.h> 

int main() { 
    int c; 

    c = f(3, 5); 
    printf("c = %d\n", c);  
    c = f(4, 2); 
    printf("c = %d\n", c);  
    c = f(2, 4); 
    printf("c = %d\n", c);  
    c = f(3, 3); 
    printf("c = %d\n", c); 
} 

int f(int d, int e) { 
    if (e > 0) 
     return f(d, e - 1) + f(d, e - 1); 
    else 
     return d;  
} 

我知道代碼給我和2 f中提升到了第二個數字d之間的產品(在f第一號)(函數)需要知道爲什麼代碼這樣的行爲 - 在C解釋代碼

問題是,我不明白爲什麼它給了我這樣的輸出,我沒有在代碼中看到任何運算符(類似於方程d * 2^e)。 一個深刻的解釋將是非常讚賞,隨意建議可以在學習C.

+1

[** **遞歸(https://en.wikipedia.org/wiki/Recursion_(computer_science))似乎是閱讀清單。 – WhozCraig

+0

我在哪裏可以找到這樣的遞歸? –

+0

google,bing,yahoo,duckduckgo,.... – kaylum

回答

1

這是一個簡單的遞歸函數,我可以用這樣的方式寫:

  | f(d, e-1) + f(d, e-1) if e > 0 
f(d,e) = | 
     | d      otherwise 

但我可以簡單地添加兩個相等的條件f(d,e-1),然後就變成:

  | 2* f(d, e-1) if e > 0 
f(d,e) = | 
     | d    otherwise 

爲了讓你明白,只是試圖擴大功能。按照規則,我可以這樣寫:

f(d,0) = d for all d // Identify function 

,由於定義,因爲e=0

走在前面:

f(d, 1) = 2*f(d, 0) =   2*d 

f(d, 2) = 2*f(d, 1) = 2*(2*d) = 4*d 

f(d, 3) = 2*f(d, 2) = 2*(4*d) = 8*d 

... // Inductivly... 
f(d, k) = 2^k *d  // for k > 0 
0

功能f(d, n)有幫助的任何材料計算d * 2 ñ。這裏是一個證明通過感應:

  1. f(d, 0)返回d,其等於d * 2

  2. f(d, n + 1)返回f(d, n + 1 - 1) + f(d, n + 1 - 1),這簡化成2 * f(d, n)。如果f(d, n)計算d * 2 Ñ,然後f(d, n + 1)計算2 * d * 2 Ñ,而這正是d * 2 n + 1個

QED:我們可以通過歸納得出結論:f(d, n)計算d * 2 ñ所有n >= 0

+0

感謝您的回覆,但是我如何從閱讀代碼知道它使用2^e生成d的產品? –

+0

您通讀代碼並理解它。瀏覽代碼並執行執行路線,然後找出結果。 – Li357

+0

@LucaMuscolo:我在步驟1和2中引用了代碼。步驟2對應於'if(e> 0)'分支,步驟1到'else'分支。 – chqrlie