繁体   English   中英

为什么在C语言中此递归会向后打印?

[英]Why does this recursion in C print backwards?

我认为该程序的输出为4321,即模1234 = 4,然后除以10得到123,所以模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;
}
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

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

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))

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

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

  1. 1234
  2. 123
  3. 12
  4. 1个

然后,以备份的方式工作,仅打印传入值的最后一位。

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

我明白了您的问题所在,这样想。

  • 通话功能;

  • 1234大于10,所以让我们重复一下该函数。

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

现在..

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

直到函数重复执行直到结束,才执行if语句。

您的函数在打印字符之前而不是之后进行递归调用。 让我们通过示例1234逐步完成代码。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM