2011-06-03 75 views
2

我是遞歸概念的新手。我想寫這需要一個浮子和整數作爲參數遞歸函數和的方式,浮點值保持不變,整數值變化c遞歸程序問題

我寫了下面的代碼遞歸調用它:

#include <stdio.h> 

float sum(float f, int k) 
{ 
    static float c; 
    c = f - k; 
    c = sum(f, k - 1); 
    return c; 
} 

int main() 
{ 
    float f, g = 10.00; 
    int i = 5; 
    f = sum(g, i); 
    printf("the sum of integer and float = %f", f); 
} 

當我編譯它顯示沒有錯誤,但是當我運行該程序時,它顯示分段錯誤。

我的問題是以下幾點:

  1. 什麼是錯的代碼?
  2. 它爲什麼顯示分割錯誤?
  3. 如何在具有多個參數的函數中使用遞歸?

請解釋一下遞歸函數的例子,它有兩個參數。

+0

這條語句c = sum(f,k-1);應該是c + = sum(f,k-1);如果涉及邏輯。 – Algorithmist 2011-06-03 07:33:12

+0

無終止條件 – Shweta 2011-06-03 08:33:26

回答

6

該代碼是錯誤的,因爲它永遠不會結束(我認爲它失敗,帶有stackoverflow錯誤)。

遞歸,你需要兩樣東西

  1. 基本情況
  2. 朝向基本情況

看起來像你只得到第二移動的遞歸情況。我懷疑總和應該返回k爲零。像這樣的東西有希望是有道理的:

float sum(float f, int k) { 
    if (k <= 0) { 
     // The base case 
     return f; 
    } else { 
     // The recursive case. This does one step of the work 
     // and moves towards the base case 
     return 1 + sum(f, k - 1); 
    } 
} 
+1

使用尾遞歸更好,所以棧保持恆定的大小。 – patapizza 2011-06-03 07:40:52

+1

是的,如果你的語言支持尾遞歸,那麼我同意。爲了解釋事情,我認爲這是在遞歸之後進行的討論。 – 2011-06-03 07:44:52

1

遞歸永不停止,並最終你用完堆棧。您需要決定何時停止遞歸。例如,如果k等於0,則不會再次撥打sum,但可以用return退出。

float sum(float f ,int k) 
{ 
    static float c; 
    if (k > 0) 
    { 
     c=f-k; /// <<< why is this here? you ignore the value and overwrite it in the next step. 
     c=sum(f,k-1); 
    } 
    return c; 
} 

當然也有另外的問題:具有c靜態可能有問題,這將影響計算的正確性,同時也因爲你失去的價值標誌着我這個地方看起來可疑,並隨後將其覆蓋致電sum

2

您的遞歸沒有基礎(非遞歸),終止大小寫。

每次撥打sum時,都會對自己進行遞歸調用,直到您的堆棧溢出,導致seg故障。

1

這個怎麼樣?

#include <stdio.h> 
float sum(float f, int k, float c) { 
    if (k == 0) 
     return c; 
    sum(f, k - 1, f - k); 
} 
1

我看到的第一件事就是你的遞歸沒有終止。它將永遠持續下去。也許你想要:

float sum(float f ,int k) 
{ 
    static float c; 

    c=f-k; 
    if (k != 0) 
     c=sum(f,k-1); 
    return c; 
} 

因此,當k爲零遞歸停止。你有一個堆棧溢出。

1

當你做遞歸時,你需要一個狀態來結束它。

所以你的代碼修改:

#include <stdio.h> 

float sum(float f, int k) 
{ 
    if(k == 0) return f; 
    return 1 + sum(f,k-1); 
} 

int main() 
{ 
    float f, g = 10.00; 
    int i = 5; 
    f = sum(g, i); 
    printf("the sum of integer and float = %f", f); 
} 

與該代碼,並您例如F = 10.00和i = 5

Call sum(10.0, 5) 
return 1 + sum(10.0, 4) 
      1 + sum(10.0, 3) 
       1 + sum(10.0, 2) 
        1 + sum(10.0, 1) 
         1 + sum(10.0, 0) 
          10 
         1 + 10 = 11 
        1 + 11 = 12 
       1 + 12 = 13 
      1 + 13 = 14 
     1 + 14 = 15 
return 15; 
0

我不明白 「求和」 功能是什麼對於。它應該加入f和k嗎?在這種情況下,沒有遞歸;你應該只添加f和k:return f + k

而是試圖回答您的問題:

  1. 沒有基本情況。這是無限遞歸的原因。每個遞歸函數都需要一個基本案例,這是一個條件,它在不會遞歸。無論如何,你的函數都是遞歸的;因此它永遠都會延續。
  2. 遞歸段錯誤時,通常是由於堆棧溢出(無雙關語);它意味着你永遠遞歸併最終耗盡空間。
  3. 您可以在具有多個參數的函數中使用遞歸,與任何其他函數一樣。只要用下一次迭代的新值就可以調用它。

請注意,您經常有一個「常數」值,在遞歸期間不會改變。爲此,您只需在遞歸調用中傳遞值不變,以便在每個步驟中都可以使用相同的值。