C++ 算法之递归问题总结

本文总结了C++中使用递归解决的一些经典问题,包括斐波那契数列的递归解法及其避免栈溢出的改进,青蛙跳台阶的递归解决方案,以及涉及递归的树结构问题,如合并单调链表、计算二叉树深度、构造二叉树镜像和判断树的子结构等。
摘要由CSDN通过智能技术生成

斐波那契数列:

n=0,f(n)=0,n=1,f(n)=1

f(n) = f(n-1) + f(n-2) 

递归解法:

int Fibonacci(int n)
    {
        if(n <= 1)
        {
            return n;
        }
        else
        {
            return Fibonacci(n - 1) + Fibonacci(n - 2);
        }
    }

问题:n过大容易导致栈溢出,改为循环

int Fibonacci(int n) {
        // 非常容易理解,0,1,2的时候单独处理
        if(n <= 0){
            return 0;
        }
        if(n == 1 || n ==2){
            return 1;
        }
        int a = 1;
        int b = 1;
        int result;
        // 然后处理的时候获取到A+B的结果,然后把B赋值给A,结果赋值给B,一步步忘后面移动
        for(int i = 3;i<=n;i++){
            result = a + b;
            a = b;
            b = result;
        }
        return result;
    }

 

青蛙变态跳台阶问题:

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

由于每次跳的阶数不确定,没有一个固定的规律,但是可以了解的是后一次跳是在前一次跳的结果上累加的,因此我们可以考虑使用递归的方法来解决问题。

  那么从递归的三个步骤开始寻找解决方案:

  1. 递归截止条件。

  由于每次可以跳1-n的任意阶数,因此无论有多少阶,都可以一次跳完,为了表示方便,我们将一次性跳完的情况设为F(0),当n=1时,只能有一种情况,F(1) = 1。当n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值