递归函数return怎么来的?
How come recursive functions return something?
看到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 函数实际上 return 只有 0,从代码中可以看出,否则它将 return 本身加上 n
.
那么函数调用是如何被翻译成数字的,函数中没有一行告诉 return 也 n 本身,除了它是 0 。
如果您观察 sum() 函数 - 它具有 return 类型的 int。
这意味着当我们从这个函数 return 时 - return 值将是一个整数。
现在这条语句是任何递归例程的关键:
return n + sum(n-1);
在这里,我们再次为 (n-1) 调用 sum() 并且它应该是 return 一个整数。在从这个函数 returning 之前 - 我们将向它添加 'n' 和 return 从这里添加一个整数。
这个递归例程可以被认为是:
sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 + sum(0)
最终等于:3+2+1+0
在下面的函数中,
int sum(int n){
if(n==0)
return n;
else
return n+sum(n-1); /* sum() returns int so its n+(returned int) */
}
它return一个int
。
else
部分调用一个函数,该函数反过来 return 是一个 int
,然后它添加 & return 最终值。
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
或
sum(3) => 3+sum(2+sum(1+sum(0))) => 6
作为所有这些很好的解释的补充,我准备了一个递归树来帮助您示意性地理解递归。如果我们以sum(3)
作为开始
sum(3)
_____|_____
| |
1 + sum(2)
___|___
| |
1 + sum(1)
___|___
| |
1 + 0 => base part (if condition came true)
请注意,所有模式都将一直等待,直到函数获取基础部分。在某种程度上,层次结构从上到下变得更加具体,直到找到答案;然后它将开始从下到上关闭所有的树枝。
看到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 函数实际上 return 只有 0,从代码中可以看出,否则它将 return 本身加上 n
.
那么函数调用是如何被翻译成数字的,函数中没有一行告诉 return 也 n 本身,除了它是 0 。
如果您观察 sum() 函数 - 它具有 return 类型的 int。 这意味着当我们从这个函数 return 时 - return 值将是一个整数。
现在这条语句是任何递归例程的关键:
return n + sum(n-1);
在这里,我们再次为 (n-1) 调用 sum() 并且它应该是 return 一个整数。在从这个函数 returning 之前 - 我们将向它添加 'n' 和 return 从这里添加一个整数。
这个递归例程可以被认为是:
sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 + sum(0)
最终等于:3+2+1+0
在下面的函数中,
int sum(int n){
if(n==0)
return n;
else
return n+sum(n-1); /* sum() returns int so its n+(returned int) */
}
它return一个int
。
else
部分调用一个函数,该函数反过来 return 是一个 int
,然后它添加 & return 最终值。
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
或
sum(3) => 3+sum(2+sum(1+sum(0))) => 6
作为所有这些很好的解释的补充,我准备了一个递归树来帮助您示意性地理解递归。如果我们以sum(3)
作为开始
sum(3)
_____|_____
| |
1 + sum(2)
___|___
| |
1 + sum(1)
___|___
| |
1 + 0 => base part (if condition came true)
请注意,所有模式都将一直等待,直到函数获取基础部分。在某种程度上,层次结构从上到下变得更加具体,直到找到答案;然后它将开始从下到上关闭所有的树枝。