递归算法和斐波那契数列

目录

1、递归算法

(1)什么是递归?

(2)递归的三要素

2、斐波那契数列

(1)什么是斐波拉契数列?

(2)用递归方法求解斐波那契数列


1、递归算法

(1)什么是递归?

递归主要是指在函数的定义中使用函数自身的方法

顾名思义,递归主要包含两个意思,,这个是递归思想的精华所在。递归就是有去(递去)有回(归来)。“有去” 是指递归问题可以分解成若干个规模较小、与原问题形式相同的子问题,这些子问题可以和原问题用相同的方法来求解。“有回” 是指这些问题的演化过程是一个从大到小,并且最终会有一个明确的终点,一旦达到终点,就可以从终点原路返回,解决原问题。

更为直接的说法就是:递归的基本思想就是把大问题转化为相似的小问题解决。特别是在程序中的函数实现时,大问题的解决方案和小问题是一模一样的,所以就产生解决一个问题会调用函数本身的情况,这个也是递归的定义。

(2)递归的三要素

  1. 递归终止条件
  2. 递归终止时候的处理方法
  3. 递归中重复的逻辑提取,缩小问题规模。

递归终止条件

递归应该是有去有回的,这样递归就必须有一个明确的分界点,递归可以在什么时候结束。程序一旦达到这个临界点,就不用继续递归重复下去了。简单来说,递归的终止条件就是为了防止出现无限递归的情况

递归终止时的处理方法

递归需要一个终止条件,在达到递归的终止条件时,需要有一个对应终止条件的程序处理方法。一般而言,在达到递归的终止条件时,对应的问题都是很容易解决的,可以快速的给出问题的解决方案。

递归中重复的逻辑提取,缩小问题规模

递归的本质上还是要将一个大的问题分解成各个逻辑相同的小问题,所以递归过程中一个重要的步骤就是提取递归中重复的逻辑规则,以便利用相同的处理方式进行处理。

按照以上递归的三要素,递归程序的一般处理可以总结成下面的伪代码:

recursion(big_problem){
   if (end_condition){  //满足递归的终止条件
       solve_end_condition;  //处理终止条件下的逻辑
       end;  //递归结束
   }else {
       recursion(small_problem);  //递归中重复的逻辑提取,缩小问题规模
   }
}

2、斐波那契数列

(1)什么是斐波拉契数列?

斐波那契数列(Fibonacci sequence),也称之为黄金分割数列,由意大利数学家列昂纳多・斐波那契(Leonardo Fibonacci)提出。斐波那契数列指的是这样的一个数列:1、1、2、3、5、8、13、21、34、……,这个数列从第 3 项开始,每一项都等于前面两项之和。在数学上,斐波那契数列可以被递推的方法定义如下:

F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

斐波那契数列是数学上面一个经典的例子,并且在日常生活中有很多应用,他还与黄金分割有着密不可分的联系,而且当 n 趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割值 0.618。

(2)用递归方法求解斐波那契数列

利用递归的思想去求解斐波那契数列,当给出一个斐波那契中第几项的数字,然后求解出对应的斐波那契数值。

  1. 斐波那契数列的递归重复逻辑提取 -> F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
  2. 斐波那契数列的递归终止条件 -> F(1),F(2) 
  3. 斐波那契数列递归终止时候的处理方法 -> F(1)=1,F(2)=1

使用 Java 代码来实现对斐波那契数列的计算:

/**
 * @author swadian
 * @date 2022/5/8
 * @Version 1.0
 * @describetion
 * 斐波那契数列(Fibonacci sequence)
 */
public class FibonacciSequence {
    /**
     * 斐波那契数列指的是这样的一个数列:1、1、2、3、5、8、13、21、34、……,
     * 这个数列从第 3 项开始,每一项都等于前面两项之和。
     * 在数学上,斐波那契数列可以被递推的方法定义如下:
     * F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
     */
    public static void main(String[] args) {
        System.out.println(fibonacci(9));
    }

    // 斐波那契数列数列的计算
    public static int fibonacci(int n){
        // 如果是终止条件,按照要求返回终止条件对应结果
        if(n == 1 || n == 2){
            return 1;
        }
        // 非终止条件,按照要求把大的问题拆分成小问题,调用自身函数递归处理
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

你可能感兴趣的:(算法啊算法,算法,递归,递归算法,斐波拉契数列)