2017-03-02 58 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)等等。 ..所以我只是纠正了你的代码并粘贴,但没有复制粘贴它。我希望你得到它.. –