2017-03-02 57 views
1

我有一個程序使用尾遞歸函數來添加輸入值和所有以前的值。例如,如果用戶輸入3,則函數計算3 + 2 + 1並得到6的答案。但是,這隻有時纔有效。添加值的遞歸函數正在輸出異常值

這裏是我下面的代碼:

int addNum(int n); 

int main(int argc, char *argv[]) { 
    int num; 
    printf("Enter an integer greater than zero, (q to quit): \n"); 
    while(scanf("%d", &num) > 0){ 
     if(num < 0){ 
      continue; 
     } 
     else if(num == 0){ 

      printf("Answer = 0 \n"); 
     } 
     else{ 

      printf("Answer = %d \n", addNum(num)); 
     } 
     printf("Enter a positive number: \n"); 

    } 
    return 0; 
} 

int addNum(int n){ 
    int answer; 
    if(n > 0){ 
    answer = n += addNum(n - 1); 
    } 
    return answer; 
} 

我從這個代碼得到的輸出是非常奇特的。對於數字0-6我得到正確的答案。一旦我得到7和8兩個答案都是不正確的。我繼續前進,9-12的答案再次正確。然後13和14是不正確的。它保持這樣回去和第四。如果有人能幫忙,我完全不知道發生了什麼。如果這是我的代碼的簡單和錯誤,請不要給我答案,而是提示問題。

我將在下面發佈輸出,以便您可以看到發生了什麼。我決定爲我的輸出使用pastebin來節省空間。 http://pastebin.com/DjJfxJAT

+0

啓用編譯器警告... – Lundin

回答

3

你不addNum()初始化answer,所以每當你有n == 0調用它,發生undefined behavior因爲你最終會返回一個未初始化的值。只有運氣好,你才能得到正確的答案。

+0

這是有道理的,感謝大家的幫助。 – Drizzy

-1

我覺得這個代碼本身說明了事情

int addNum(int n); 
int answer=0; 
int main(int argc, char *argv[]) { 


    int num; 

    printf("Enter an integer greater than zero, (q to quit): \n"); 


    while(scanf("%d", &num) > 0){ 


     if(num < 0){ 
      continue; 
     } 
     else if(num == 0){ 

      printf("Answer = 0 \n"); 
     } 
     else{ 
      answer=0; 
      printf("Answer = %d \n", addNum(num)); 
     } 

     printf("Enter a positive number: \n"); 

     } 

    return 0; 
} 
    int addNum(int n){ 


     if(n > 0){ 

     answer = n += addNum(n - 1); 
     } 
     return answer; 
    } 
+0

我沒有投票,你別人做了。你能通過粘貼我的代碼來解釋你的意思嗎?我是C新手,只是想學習。我犯的每一個錯誤都是我可以從中學習成爲一名更好的程序員的教訓。如果你對如何提高我有一個實際的建議,我非常喜歡並且會喜歡它。如果你只是想傲慢自大,那麼你也可以這樣做。 – Drizzy

+0

實際上,在您爲您提供的每個輸入的代碼中都沒有使可變回答= 0。因此,如果第一個輸入爲2,則輸出爲3(答案= 3)。如果第二個輸入爲5,則返回3+(5 + 4 + 3 + 2 + 1).....(答案= 18)等等。 ..所以我只是糾正了你的代碼並粘貼,但沒有複製粘貼它。我希望你得到它.. –