为什么递归函数会返回什么?

时间:2016-05-27 04:02:04

标签: c function recursion logic recursive-query

我在c语言中看到了一个递归函数示例。

#include <stdio.h>
int sum(int n);
int main(){
    int num,add;
    printf("Enter a positive integer:\n");
    scanf("%d",&num);
    add=sum(num);
    printf("sum=%d",add);
}
int sum(int n){
    if(n==0)
       return n;
    else
       return n+sum(n-1);    /*self call  to function sum() */
}

但是在这里我无法理解sum函数实际上只返回0,从代码中可以看到它会返回自己加n

那么如何将函数调用转换为数字,函数中没有行告诉它本身返回n除了它是0。

3 个答案:

答案 0 :(得分:10)

如果你观察sum()函数 - 它的返回类型为int。 这意味着当我们从这个函数返回时 - 返回值将是一个整数。

现在这里的语句是任何递归例程的关键:

return n + sum(n-1);

这里,我们再次为(n-1)调用sum(),它应该返回一个整数。在从此功能返回之前 - 我们将添加&#39; n&#39;它,并从这里返回一个整数。

这个递归例程可以被认为是:

sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 + sum(0)

最终等于:3 + 2 + 1 + 0

答案 1 :(得分:4)

在下面的功能中,

int sum(int n){
    if(n==0)
       return n;
    else
       return n+sum(n-1);    /* sum() returns int so its n+(returned int) */
}

它会返回int

else部分调用一个函数,该函数返回int,然后执行add&amp;返回最终值。

sum(1) => 1+sum(0) => 1+0 => 1
sum(2) => 2+sum(1) => 2+(1+sum(0)) => 2+(1+0) => 2+(1) => 3
...

你也可以把它写成 -

sum(3) => 3+sum(2) => 6

OR

sum(3) => 3+sum(2+sum(1+sum(0))) => 6

答案 2 :(得分:0)

作为所有这些好解释的补充,我准备了一个递归树来帮助你理解递归。如果我们将sum(3)作为开始

         sum(3)
      _____|_____
      |         |
      1    +  sum(2)
             ___|___
             |     |
             1  + sum(1)
                ___|___
                |     |
                1  +  0 => base part (if condition came true)

请注意,所有架构都将一直等待,直到函数获得基本部分。在某种程度上,层次结构从上到下更具体,直到找到答案为止;然后它将从底部到顶部开始关闭所有树枝。