学会这些,轻松解决部分递归算法

一、说明

递归算法是一种直接或者间接调用自身的算法,其本身带有一定的规律。
本文主要从题目入手,引出技巧,解决部分递归算法,同时通过在日常工作过程中的真实案例结尾。

二、技巧

掌握下列技巧,就能很好的解决递归算法。
1、查找规律,找出递推公式。
2、处理特殊情况。处理边界条件。

三、实战

1、阶乘
题目:

计算n*(n-1)(n-2)…2*1

思路:
1、 令f(n)=n*(n-1)(n-2)…21。则f(1)=1;f(2)=21=2f(1);f(2)=321=3(2f(1))=3f(2)…,以此类推可得f(n)=nf(n-1);
2、查找边界条件,f(1)=1
f(0)不满足,故令f(1)=1;
代码:

public static int factorial(int n){
    if(n==1) return 1;
    return n*factorial(n-1);
}

2、斐波那契数列
题目:

斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…,求解第n项。

思路:
1、查找规律,令f(n)表示第n项的值。则f(1)=1;f(2)=1;f(3)=2;此时有几种猜想。
  猜想1:f(3)=2f(2);即f(n)=2f(n-1);
  猜想2:f(3)=2f(1);即f(n)=2f(n-2);
  猜想3:f(3)=f(1)+f(2);即f(n)=f(n-1)+f(n-2);
将上面3种猜想代入题目中,发现f(4)=3=f(3)+f(2);猜想1和猜想2不满足题目要求,接着代入更多数据,发现猜想3始终满足条件,则查找出递推公式为:f(n)=f(n-1)+f(n-2);

2、将特殊值(一般为边界值)代入公式中,f(1)=f(0)+f(-1);发现越界了(没有第0项和第-1项),故第一项不满足;f(2)=f(1)+f(0),同理第0项不存在,故第二项不满足公式。此时可以得知特殊情况为f(1)=1;f(2)=1;由公式可知,公式为逐项递减相加,故特殊情况即边界条件,此时结束递归。

代码:

   //斐波那契数列
public static int fibonacciSeries(int n){
    //确认边界条件
    if(n==1||n==2) return 1;
    return fibonacciSeries(n-1)+fibonacciSeries(n-2);
}

运行结果:
在这里插入图片描述

四、真实案例

树形结构在工作中很常见,实现一个树形结构的方法之一就是递归。
一般在设计表中有id,pid就可以实现一颗简单的树。
在这里插入图片描述

现在模拟数据库查询到的数据。
新建实体类TreeEntity,字段如下

    private Integer id;
    private Integer pid;
    private Integer name;
    private List<TreeEntity> children;

模拟数据如下:

        List<TreeEntity> treeEntityArrayList = new ArrayList<>();
        treeEntityArrayList.add(new TreeEntity(1,0,"湖北"));
        treeEntityArrayList.add(new TreeEntity(2,0,"湖南"));
        treeEntityArrayList.add(new TreeEntity(3,1,"武汉"));
        treeEntityArrayList.add(new TreeEntity(4,1,"荆州"));
        treeEntityArrayList.add(new TreeEntity(5,4,"松滋"));

思路:
通过id遍历集合,可以获取子集合,当id遍历下,获取不到子集合时,则递归结束。
代码:

    public static List<TreeEntity> getChildren(List<TreeEntity> list,Integer pid){
        return list.stream()
                //获取子节点
                .filter(treeEntity -> treeEntity.getPid().equals(pid))
                //遍历子节点并获取孙子节点
                .map(treeEntity -> {
                       treeEntity.setChildren(getChildren(list,treeEntity.getId()));
                       return treeEntity;
                })
                .collect(Collectors.toList());
    }

最后感谢您的观看,我是一个不断进步的小白,希望您能点点关注,有什么问题可以评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值