为什么C中的这种递归向后打印?

时间:2014-12-26 22:26:44

标签: c visual-studio-2012 recursion

我认为这个程序的输出是4321.即modulo 1234 = 4,然后除以10得到123,所以modulo 123 = 3 ...当完成时应该是4321.但输出是1234。有人可以解释一下这是怎么回事吗?非常感谢和节日快乐。

void printnumber(int n) { //function declaration
    if (n < 0) {
        putchar('-');
        printnumber(-n); //recursive call
    } else {
        if (n >= 10) {
            printnumber(n / 10); //second recursive call
        }
        putchar('0' + (n % 10));
    }
}
int main() {
    int n = 1234;
    printnumber(n);
    putchar('\n');
    return 0;
}

5 个答案:

答案 0 :(得分:2)

First call to function, input 1234

   Second call to fucntion, input 123

      Third call to function, input 12

          Fourth call to function, input 1

          print 1 and return

      print 2 and return

   print 3 and return

print 4 and return

Output: 1234

答案 1 :(得分:1)

原因是因为首先调用的函数将打印最后的,即语句

putchar('0' + (n % 10));  
n变得小于10时,

将首次执行,这将打印1然后2然后3,然后4 }。

printnumber(1234) --> printnumber(123) --> printnumber(12) --> putchar('0' + (1 % 10))  
                                                                          |
                                                                          V 
  putchar('0' + (1234 % 10)) <-- putchar('0' + (123 % 10)) <-- putchar('0' + (12 % 10))

答案 2 :(得分:1)

原因是您在递归调用后打印。

因此,对于您的示例,它会将以下值(按顺序)传递给您的printnumber函数。

  1. 1234
  2. 123
  3. 12
  4. 1
  5. 然后,重新开始工作,只打印传入值的最后一位数字。

    要更正此问题,请将putchar行移至递归之前。

答案 3 :(得分:1)

我知道你的问题是什么,请按照这个想法。

  • 通话功能;

  • 1234大于10,所以让我们重复一下这个功能。

  • 123大于10,所以让我们重复一下这个功能。
  • 12大于10,所以让我们重复一下这个功能。
  • 1小于10,然后执行if语句。

现在..

  • 我们可以打印1%10;
  • 我们可以打印12%10;
  • 我们可以打印出123%10;
  • 我们可以打印出1234%10;

在重复该函数直到结束之前,不会执行if语句。

答案 4 :(得分:0)

你的函数在打印字符之前递归调用,而不是之后。让我们使用您的1234

示例逐步执行代码

首先,我们调用函数printnumber(1234)。在此函数中,我们会立即转到else块,该块会调用printnumber(123),而printnumber(12)会调用printnumber(1),调用printnumber(1)。最后,else进入>= 10块,但它不是1,因此它只打印printnumber(12)并退出,返回2,现在打印{{1}},等等。

此外,这正是调试器(例如gdb)的用途。