算法之-------递归与递推

概念

  • 递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归。
  • 递推:递推算法是一种用若干步可重复运算来描述复杂问题的方法。递推是序列计算中的一种常用算法。通常是通过计算机前面的一些项来得出序列中的指定象的值。
  • 递归与递推区别:相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。

算法举例1

  • 斐波那契数列:已知f(1) = 1 , f(2) = 1 , 且满足关系式f(n) = f(n-1) + f(n-2),则f(50)等于多少?
  • 分析:根据初始条件f(1) = 1 , f(2) = 1 和关系式f(n) = f(n-1) + f(n-2),可知,f(3) = f(2) + f(1) , f(3) = f(2) + f(1) …….
  • 编写代码(递归)
public class Fibonacci {

    static int fun(int n){
        if(n == 1 || n == 2){
            return 1 ;
        }else{
            return fun(n-1) + fun(n-2) ;
        }
    }
    public static void main(String[] args) {
        for(int i = 1 ; i <= 15 ; ++i)
        System.out.println(fun(i));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 编写代码(递推)
static int fun2(int n){
        int a[] = new int[20] ;
        a[1] = 1 ;
        a[2] = 1 ;
        for(int i=3 ; i<=n ;i++){
            a[i] = a[i-1] + a[i-2] ;
        }
        return a[n] ;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 运行结果:
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

算法举例2

  • 使用递归计算1+2+…+100 ;
  • 分析:递归关系为f(n) = f(n-1) + n ,递归出口为f(1) = 1 ;
  • 编写代码(递归):
public class Sum {

    static int fun(int n){
        if( n == 1){
            return 1 ;
        }else{
            return fun(n-1) + n ;
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(fun(100));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 编写代码(递推)
static int fun2(int n){
        int a[] = new int [200] ;
        a[1] = 1 ;
        for(int i=2 ; i<=n ; i++){
            a[i] = a[i-1] + i ;
        }
        return a[n] ;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 运行结果:
5050
  • 1

算法举例3

  • 爬楼问题:假设有n阶楼梯,每次可爬1阶或2阶,则爬到第n层有几种方案?
  • 问题分析:假设一阶时只有一种方案f(1) = 1 ; 二阶时有两种方案(即一次走一阶和一次走两阶)f(2) = 2 ;三阶时有3种 f(3) = 3 ;四阶时有五种 f(5) = 5 ;发现递归规律f(n) = f(n-1) + f(n-2) ; 递归出口为f(1) = 1、f(2) = 2 ;
  • 编写代码(递归):
public class Ladder {

    static int fun(int n){
        if(n == 1){
            return 1 ;
        }else if(n == 2){
            return 2 ;
        }else{
            return fun(n-1) + fun(n-2) ;
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(fun(5));
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 编写代码(递推):
static int fun2(int n){
        int a[] = new int [200] ;
        a[1] = 1 ;
        a[2] = 2 ;
        for(int i=3 ; i<=n ;i++){
            a[i] = a[i-1] + a[i-2] ;
        }
        return a[n] ;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 运行结果:
8
  • 1

由上述例子可知,递归的重点是找到递归关系和递归出口。

    原文作者:算法
    原文地址: https://www.twblogs.net/a/5bd39b7d2b717778ac208b3a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞