递归与栈

栈是一种数据结构,进栈的数据遵循一个规则:先进后出。

所有的函数调用都会进栈。

递归指的是调用自己的函数。最经典的例子就是阶乘计算。

每个递归函数都有两个条件:基线条件和递归条件。

我们在调用递归时,每一次 的递归调用都会进入栈,最上层的函数调用只能访问自己的变量,不能访问其它调用变量。每一次的调用都会占据一定的内存来存储变量,如果递归没有终止的话,就会把内存占满,从而死机。因此,我们希望递归有一个终止,这个终止称为基线条件。

递归的本质就是分而治之,把一个规模较大的问题分解成若干个问题较小的问题,然后逐个解决。

基线条件就是分解出来的最小粒度的问题,问题分解到这一步就不再细分,也可以看作是终止条件。

递归条件是满足继续缩小问题规模的条件,使其符合基线条件。

编写涉及数组的递归函数时,基线条件通常是数组为空或者只包含一个元素。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class demo {
    public static void main(String[] args) {
        int[] arr= {0,1,2,3,4};
        System.out.println(digui(arr,arr.length-1));
    }
    //求一个数组的所有元素之和,这个问题其实可以看成求元素的前n项之和,这样函数的适用范围更广
    //基线条件就是数组的元素为0个
    //递归条件为数组及其剩余的元素个数
    //递归时最好不要新建变量
    private static int  digui(int[] arr,int n){
        if(n==0){
            return 0;
        }else{
            return arr[n]+digui(arr,n-1);
        }
    }
}

  

posted @ 2020-11-20 17:29  dingzhiwen  阅读(297)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示