递归算法介绍及常用案例介绍(阶乘,斐波那契数列,把一个数分解成任意几个数的和)

递归算法递归是一个从上到下不停调用自身函数的方法。递归算法最重要的就是递和归这两个字,先得递出去之后才能归回来。递的过程就是调用自身函数一直向下的过程,归则是函数到达了递归终止的条件,逐级返回的过程。
在递归的过程当中一定要有一个递归出口作为递归结束的标志。否则迎接你的只会是StackOverflowError(因为递归次数太多导致的堆空间不足产生的错误)

计算斐波那契数列前N项和

方法一:普通方法

int fibonacci1(int n) {
        int f[] = new int[50];
        f[0] = 1;
        f[1] = 1;
        int sum = 2;
        for (int x = 2; x <= n - 1; x++) {
            f[x] = f[x - 1] + f[x - 2];
            sum += f[x];
        }
        return sum;
    }

其时间复杂度为O(n);
方法二:递归

int fibonacci2(int n) {
        if (n<=2) {
            return 1;
        } else {
            return fibonacci2(n - 1) + fibonacci2(n - 2);
        }
    }
@Test
    public void test2() {
        int sum =0;
        for (int a = 1; a <= 30; a++) {
            sum += fibonacci2(a);
        }
        System.out.println(sum);
    }

其时间复杂度为T:递归函数的时间复杂度;depth:递归函数的深度;
O(T*depth)=O(n)

计算N的阶乘

    @Test
    public void test(){
        int sum = factorial(6);
        System.out.println(sum);
    }
    int factorial(int n){
        if (n ==1){
            return 1;
        }else {
            return n*factorial(n-1);
        }
    }

阶乘公式为:!n=123*…*n,每层n都减一逐层向下递,知道达到递归出口n=1结束递归。

此图片来自递归算法总结

在这里插入图片描述

和数分解: 把一个数分解成任意几个数的和, 并把所有的可能性都列出来

int[] arr;
    int num = 10;
    @Test
    public void test() {
        arr = new int[num];
        div(num, 1, 0);
    }
    void div(int n, int s, int x) {
        if (n > 0) {
            for (int i = s; i <= n; i++) {
                arr[x] = i;
                div(n - i, i, x + 1);
            }
            return;
        }
        if (num != arr[0]) {
            System.out.print(num + "=" + arr[0]);
        }
        for (int i = 1; i < x; i++) {
            System.out.print("+" + arr[i]);
        }
        System.out.println();
    }

递归算法的介绍到此为止,下一篇文章将为您介绍利用递归完成二分排序!

感谢您的阅读,如果本篇文章对您有帮助,欢迎点赞,关注,您的阅读是我莫大的鼓励!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值