[英]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
函数。
然后,以备份的方式工作,仅打印传入值的最后一位。
若要更正此问题,请将putchar
行移到递归之前。
我明白了您的问题所在,这样想。
通话功能;
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.