开始慢慢理解递归原理

mac2024-03-28  2

看算法设计与分析课本!

递归的过程就是入栈出栈的过程!

先以阶乘递归函数作为形象示例:

系统栈变化过程:

贴个代码说明:

代码是利用递归在一个数组中找到最大元素,从后往前搜索,两两对比,前一个赋值为较大的值,

然后fmax(a,i-1),继续往前比较,直到a[0]为最大值。

public class 数组中的最大元素 { //方式1 static int fmax1(int[] a,int i){ if(i==1){ System.out.println("start"); return 0; } if(a[i-1]>a[i-2]){ a[i-2]=a[i-1]; } fmax1(a,i-1); //后面还有代码,在递归的出栈阶段会执行!!! System.out.println("FINAL"); return a[0]; } //方式2 static int fmax2(int[] a,int i){ if(i==1){ System.out.println("start"); return a[0]; } if(a[i-1]>a[i-2]){ a[i-2]=a[i-1]; } System.out.println("FINAL"); return fmax2(a,i-1); } public static void main(String[] args) { // TODO 自动生成的方法存根 int[] a={1,2,-1,56,37}; System.out.println(fmax1(a,5)); } }

方式1的运行结果:

注意!为了证明的易于理解,我把i=1情况下的return语句返回的是0,而不是a[0]!

start FINAL FINAL FINAL FINAL 56

由此分析直到最后i==1时执行了输出"start"之后才执行了递归语句fmax(a,i-1)之后的代码(输出"FINAL"),也就是递归语句fmax(a,i-1)那里是一个断点,从那开始递归执行(入栈,i从5到1),然后一直到执行完i==1的情况后,开始出栈(跳到i==2,输出"FINAL",一直到i=5,即输出4个"FINAL",这个函数的最终的return其实是执行的最后那句return a[0]!!!没有执行i==1里面的return,要不返回值就是0了!!!)

方式二的运行结果:

注意!方式二是尾递归(如果一个递归过程或递归调用语句是最后一条执行语句,则称这种递归为尾递归),而最后的返回值在i==1的代码块中!

FINAL FINAL FINAL FINAL start 56

 由与运行结果易知每次调用函数都会先输出"FINAL",然后在i==1的情况下到达了跳出条件(递归出口),直接返回a[0].

可见方式二简单易懂!

 

最新回复(0)