关于c的递归调用返回值的计算

# 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}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值