即使return
语句仅在if
(基本情况)内,我花了好几个小时试图弄清楚为什么这个递归函数有效。
#include<stdio.h>
int main( void )
{
int sum_recursive_function( int const number_copy );//function prototype
int number, sum_recursive;
puts( "Please type a number and I will add its digits:" );
scanf( "%d", &number );
sum_recursive = sum_recursive_function( number );
printf( "%s%d\n", "The sum of the digits is: ", sum_recursive );
}
int sum_recursive_function( int const number_copy )
{
int last_digit, sum_pre = 0;
if( number_copy == 0 ){
return sum_pre;
}
else{
last_digit = number_copy % 10;
sum_pre = last_digit + sum_recursive_function( number_copy / 10 );
}
}
我明白这一点:
如果我输入数字1,函数内的if
检查number_copy
是否等于0,因为它不是,它进入了else语句,然后1的余数除以10 = 1被分配到last_digit
。 Last_digit
(1)添加了递归调用,该调用将1/10 = 0发送到sum_recursive_function
。这一次sum_recursive_function
检查参数是否等于0,并且当它等于0时,它返回sum_pre
为0. Sum_pre
= 1 + 0.然后我不这样做理解sum_recursive_function
如何将Sum_pre
(1)返回到main。
答案 0 :(得分:2)
您的代码展示未定义的行为。 sum_recursive_function()
需要始终返回一个值。
让我们解决它:
int sum_recursive_function(int const number_copy)
{
if (number_copy == 0) {
return 0;
} else {
int last_digit = number_copy % 10;
return last_digit + sum_recursive_function( number_copy / 10 );
}
}
也许正确的代码可以让您更好地理解这一点。
答案 1 :(得分:2)
实际上,即使它最初定义,sum_recursive_function
也总是返回一个值。
让我试着解释一下这行上发生的递归( magic 是这样的):
sum_pre = last_digit + sum_recursive_function( number_copy / 10 );
假设输入参数是数字:12345
检查那些错误:
1. sum_pre = 5 + sum_recursive_function( 1234 );
2. sum_pre = 5 + 4 + sum_recursive_function( 123 );
3. sum_pre = 5 + 4 + 3 + sum_recursive_function( 12 );
4. sum_pre = 5 + 4 + 3 + 2 + sum_recursive_function( 1 );
5. sum_pre = 5 + 4 + 3 + 2 + 1 + 0;
在第一步,last_digit的值为5,接下来是4,然后是3,然后是2,然后是1。 在迭代#5,递归结束。
我希望这有助于更好地理解递归!
答案 2 :(得分:2)
即使没有return语句(在这种情况下是偶然的)代码工作的原因是因为通过x86调用约定,函数的返回值(更具体地说是整数或指针)存储在EAX寄存器中。因此,一旦函数存在,EAX寄存器中的最后一个值将被视为函数的返回值。
您可以通过将此内联汇编附加到递归函数的末尾来测试它。
asm ("mov $5, %eax");
现在您的程序将始终打印5而不是实际总和。