# include <stdio.h>
int Sum(int n); //函数声明
int main(void)
{
int n;
printf("请输入n的值:");
scanf("%d", &n);
printf("sum = %d\n", Sum(n));
return 0;
}
int Sum(int n)
{
if (n <= 0)
{
return -1;
}
else if (1 == n)
{
return 1;
}
else
{
return n+Sum(n-1);
}
}
假设n为5。调用函数sum(5)执行其中的代码。
n=5
//n为5时sum(5)执行到return n+Sum(n-1)时,无返回值
5+sum(4)
//放入栈后,此时再次调用自身sum(4),执行到return n+Sum(4-1),无返回值
4+sum(3)
//放入栈后,此时再次调用自身sum(3),执行到return n+Sum(3-1),无返回值
3+sum(2)
//放入栈后,此时再次调用自身sum(2),执行到return n+Sum(2-1),无返回值
2+sum(1)
/*放入栈后,此时再次调用自身sum(1),执行到else if (1 == n),返回值=1,
开始出栈,入栈出栈规则是先入后出,就像堆箱子,堆到顶后要从顶部开始取箱子最后才能拿到最底的箱子。
当前顶部的是2+sum1(1),所以返回值1返回到s+sum(1)即2+1=3,最顶层的返回值变为3。
再次拿第二箱子3+sum(2)即3+3=6,返回值为6。第三层箱子4+sum(3)即4+6=10,返回值为10。
最低层箱子5+sum(4)即5+10=15。这时返回值15再次返回到主函数main中,打印出sum(n)的最终返回值15。
这就是1-5累加合的流程。
*/
下面是用递归求斐波那契数列(即数列中每一个数值都是其前两个数值之和[0 1 1 2 3 5 8 13 21 34 55........])
# include <stdio.h>
long Fibonacci(int n); //函数声明
int main(void)
{
int n;
printf("请输入n的值:");
scanf("%d", &n);
printf("第n项的值为:%ld\n", Fibonacci(n));
return 0;
}
long Fibonacci(int n)
{
if (n < 0)
{
return -1;
}
else if (0 == n)
{
return 0;
}
else if (1 == n)
{
return 1;
}
else
{
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
这里我们还假设n=5。[中括号为当前返回值],{大括号为2个返回值的和}。
n=5
Fibonacci(5-1){3}+Fibonacci(5-2){2}={5}最后返回5。
n=3
Fibonacci(3-1){1}+Fibonacci(3-2)[1]={2}
n=2 n=1返回值是[1] 最终返回值是{1}+[1]={2}
Fibonacci(2-1)[1]+Fibonacci(2-2)[0]={1}
n=1返回值是[1] n=0返回值是[0] 最终返回值是[1]+[0]={1}
n=4
Fibonacci(4-1){2}+Fibonacci(4-2){1}={3}
n=2
Fibonacci(2-1)[1]+Fibonacci(2-2)[0]={1}
n=1返回值是[1] n=0返回值是[0] 最终返回值是[1]+[0]={1}
n=3
Fibonacci(3-1){1}+Fibonacci(3-2)[1]={2}
n=1返回值是[1] 最终返回值是{1}+[1]={2}
n=2
Fibonacci(2-1)[1]+Fibonacci(2-2)[0]={1}
n=1返回值是[1] n=0返回值是[0] 最终返回值是[1]+[0]={1}