递归与栈
栈是一种数据结构,进栈的数据遵循一个规则:先进后出。
所有的函数调用都会进栈。
递归指的是调用自己的函数。最经典的例子就是阶乘计算。
每个递归函数都有两个条件:基线条件和递归条件。
我们在调用递归时,每一次 的递归调用都会进入栈,最上层的函数调用只能访问自己的变量,不能访问其它调用变量。每一次的调用都会占据一定的内存来存储变量,如果递归没有终止的话,就会把内存占满,从而死机。因此,我们希望递归有一个终止,这个终止称为基线条件。
递归的本质就是分而治之,把一个规模较大的问题分解成若干个问题较小的问题,然后逐个解决。
基线条件就是分解出来的最小粒度的问题,问题分解到这一步就不再细分,也可以看作是终止条件。
递归条件是满足继续缩小问题规模的条件,使其符合基线条件。
编写涉及数组的递归函数时,基线条件通常是数组为空或者只包含一个元素。。
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 ); } } } |
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步