添加值的递归函数输出异常值

时间:2017-03-02 05:35:32

标签: c recursion while-loop output tail-recursion

我有一个程序,它使用尾递归函数来添加输入的值和所有以前的值。例如,如果用户输入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

2 个答案:

答案 0 :(得分:3)

您不会在answer中初始化addNum(),因此每当您使用n == 0调用它时,undefined behavior就会发生,因为您最终会返回未初始化的值。只有运气才能得到正确答案。

答案 1 :(得分:-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;
  }