这个递归函数如何将值返回给main?

时间:2014-10-12 05:09:27

标签: c recursion

即使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_digitLast_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。

3 个答案:

答案 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而不是实际总和。

https://en.wikipedia.org/wiki/X86_calling_conventions