欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法之 递归

程序员文章站 2022-06-03 13:25:41
...

--------递归在程序语言中简单的理解是:方法自己调用自己

一、简单递归

描叙

递归就是自己调用自己,不过需要注意的地方,需要给定跳出条件
算法之 递归

代码示例

/**
 * 1、简单递归
 */
public class test1 {

    public static void main(String[] args) {
        fa(100);
    }


    public static void fa(int i) {
        if (i == 0) {
            return;
        }
        System.out.println(i);
        fa(i-1);
    }
}

二、三角数字递归

描叙

什么是三角数字
n个三角数字是 由 1+2+3…+n 所得值计算一个典型的三角数字。

  • 1 的三角数字是1
  • 2 的三角数字是 1+2 =3
  • 3 的三角数字是 1 + 2 + 3 = 6
  • 4 的三角数字是 1 + 2 + 3 + 4 = 10

下面通过代 计算 1+2+3…+n 所得值为多少

代码示例

package recursion;

/**
 * 2、三角数字递归
 * <p>
 * 首先大家应该知道什么是三角数字,三角数字的定义就是:
 * 滴n个三角数字是 由 1+。。。+n所得。
 * ........
 * 例如:
 * 1 的三角数字是1
 * 2 的三角数字是 1+2 =3
 * 3 的三角数字是 1 + 2 + 3 = 6
 * 4 的三角数字是 1 + 2 + 3 + 4 = 10
 * ..................................
 * 公式=   n= n+( n-1) 
 */
public class test2 {

    public static void main(String[] args) {
        System.out.println("1 的三角数字是" + fa(1));
        System.out.println("2 的三角数字是" + fa(2));
        System.out.println("3 的三角数字是" + fa(3));
        System.out.println("4 的三角数字是" + fa(4));
    }


    /**
     * @param i
     */
    public static int fa(int i) {
        if (i == 1) {
            return 1;
        } else {
            return i + fa(i - 1);    // 4 +  3  + 2  +  1 (  1 是  (i == 1) 处的 1 )
        }
    }

}


三、Fibonacci 树列递归 ( 斐波那契数列)

描叙

斐波那契数列就是典型的树列递归, 又名兔子数列 ,指的是这样一个数列:0,1、1、2、3、5、8、13、21、34、……

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

代码示例

package recursion;

/**
 * 3、Fibonacci 树列递归 (斐波那契数列 = 兔子数列),指的是这样一个数列:0,1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。
 * <p>
 * 兔子问题,已知: 有一对刚出生的兔子,兔子从出生后的第三个月起开始每月生出一对小兔子,生成的小兔子第三个月起也开始每月生小兔子,假如兔子不会死,问20个月后兔子总数?
 * <p>
 * 第一月  1 (1)
 * 第二月  1
 * 第三月  2   一月生 1 对( 1+ 1 = 2)  --> 生出1对
 * 第四月  3   一月生 1 对( 2+ 1 = 3)  --> 生出1对
 * 第五月  5   一月生 1 对,三月生 1 对 ( 3 + 1+ 1 = 3)   --> 生出2对
 * 第六月  8   一月生 1 对,三月生 1 对,四月生 1 对  ( 5+1+1+1 = 8)   --> 生出3对
 * 第七月  13  一月生 1 对,三月生 1 对,四月生 1 对,五月生 2对  ( 8+ 1+1+1 +2 = 13)   --> 生出5对
 * </p>
 * 公式: 当前月数量 = 上1月 + 上2月 , 出生数量= 上2月
 * <p>
 * F0 = 0; F1 = 1; Fn = Fn-1 + Fn-2
 */
 
public class test3 {
    public static void main(String[] args) {
        //rabbit();
        System.out.println(fib(24));
    }


    /**
     * 使用递归
     */
    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            // 公式: 当前月数量 = 上1月 + 上2月 ,  System.out.println("第 " + n + "月出生" + num + "对, 总数量" + num + ",");
            return fib(n - 1) + fib(n - 2);
        }
    }


    /**
     * 使用循环
     */
    public static void rabbit() {
        System.out.println("第 1 个月兔子数 1 对");
        System.out.println("第 2 个月兔子数 1 对");
        int f1 = 1;
        int f2 = 1;
        int M = 24;
        int x;
        for (int i = 3; i <= M; i++) {
            x = f2;         // 上月总数
            f2 = f1 + f2;   // 本月总数 = 上月总数 + 上上月总数
            f1 = x;         // 把上月总数 定义成 下次循环的上上月总数
            System.out.println("第 " + i + " 个月兔子数 " + f2 + " 对");
        }
    }
}


本文到此结束,如果觉得有用,劳烦各位点赞关注一下呗,将不定时持续更新更多的内容…,感谢大家的观看!

相关标签: 算法