Java进阶-递归算法

递归算法

递归概述

递归:递进回归

代码中的体现:方法内部调用方法本身

递归的注意事项

递归的注意事项:
1.定义一个方法且该方法必须有形参
2.必须要有程序出口且递归的次数最好不要太多了
    --->避免发生栈溢出StackOverflowError
3.在该方法内部调用方法自身的时候,传入的参数要朝着出口方向变化

递归的关键

写递归最重要的是找到规律

递归的简单应用

求1-n的和
问题描述
1~n的和,用递归去实现
问题分析
对于该问题,比如说求1~7的和:
1~7的和() = 7 + 1~6的和()
1~6的和() = 6 + 1~5的和()
1~5的和() = 5 + 1~4的和()
1~4的和() = 4 + 1~3的和()
1~3的和() = 3 + 1~2的和()
1~2的和() = 2 + 1~1的和()
1~1的和() = 1--->程序出口
规律
1~n的和() = n + [1~(n - 1)的和()]
具体代码
package com.tan.recursion;
/*
问题描述:
求1~n的和,用递归去实现

写递归最重要的是找到规律

对于该问题,比如说求1~7的和:
1~7的和() = 7 + 1~6的和()
1~6的和() = 6 + 1~5的和()
1~5的和() = 5 + 1~4的和()
1~4的和() = 4 + 1~3的和()
1~3的和() = 3 + 1~2的和()
1~2的和() = 2 + 1~1的和()
1~1的和() = 1--->程序出口

因此我们可以找到规律:
求1~n的和() = n + [1~(n - 1)的和()]

递归的注意事项:
1.定义一个方法且该方法必须有形参
2.必须要有程序出口且递归的次数最好不要太多了
    --->避免发生栈溢出StackOverflowError
3.在该方法内部调用方法自身的时候,传入的参数要朝着出口方向变化


 */
public class Recursion {
    public static void main(String[] args) {
        System.out.println("sum(7) = " + sum(7));
    }

    public static int sum(int num){
        if (num == 1){
            return 1;
        }

        return num + sum(num - 1);
    }
}

求1-n的阶乘
问题描述
1~n的阶乘,用递归去实现
问题分析
对于该问题,比如说求1~7的阶乘()1~7的阶乘() = 7 * 1~6的阶乘()
1~6的阶乘() = 6 * 1~5的阶乘()
1~5的阶乘() = 5 * 1~4的阶乘()
1~4的阶乘() = 4 * 1~3的阶乘()
1~3的阶乘() = 3 * 1~2的阶乘()
1~2的阶乘() = 2 * 1~1的阶乘()
1~1的阶乘() = 1--->程序出口
规律
1-n的阶乘 = n * (n-1)的阶乘
具体代码
package com.tan.recursion;
/*
问题描述:
求1-n的阶乘

规律:
1-n的阶乘 = n * (n-1)的阶乘

出口:
1的阶乘 = 1
 */
public class Recursion {
    public static void main(String[] args) {
        System.out.println("factorial(5) = " + factorial(5));
    }
    public static int factorial(int num){
        if(num == 1) return 1;
        return num * factorial(num-1);
    }
}

求斐波那契数列
问题描述
求斐波那契数列,用递归去实现
问题分析
斐波那契数列:
F(0)=1F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

出口:F(0)=1F(1)=1
规律
F(n)=F(n - 1)+F(n - 2)
具体代码
package com.tan.recursion;
/*
注意:递归次数不要过多,会有栈内存溢出的错误发生

斐波那契数列:
F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
 */
public class Recursion {
    public static void main(String[] args) {
        System.out.println("fibonacci(20) = " + fibonacci(20));
    }

    /*
        要注意递归方法的返回值,如果递归次数过多,可能会导致超过返回值类型的最大范围,
        导致强制转换过程中丢失位数,进而可能会出去次数先增加后又减少的情况发生
     */
    public static int fibonacci(int num){
        if(num == 1 || num == 2){
            return 1;
        }

        return fibonacci(num - 1) + fibonacci(num - 2);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值