邓州网站优化营销型网站怎么做
递归算法
什么是递归算法
在过程或者函数里调用自身的算法;
递归算法(recursion algorithm),通过重复将问题分解为同类的子问题而解决问题的方法,
Java中函数可以通过调用自身来进行递归,大多数编程语句皆是如此;
递归的作用可以完全取代循环。
递归阶乘
package com.sin.demo.recursive;/*** @author sin* @date 2022/11/2* @apiNote*/
public class RecursiveDemo {public static void main(String[] args) {int a = factorialTest(5);System.out.println(a);}/*** 递归阶乘* @param a 阶乘参数* @return*/public static int factorialTest(int a) {if (a == 0)return 1;elsereturn a * factorialTest(a - 1);}}
结果
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tp2lCiMf-1677668556238)(递归算法.assets/image-20221102101551854.png)]](https://img-blog.csdnimg.cn/a450cb800d644607957b5bee0d22483c.png)
循环阶乘
public static void main(String[] args) {int a = factorialTest1(5);System.out.println(a);}/*** 循环阶乘* @param a 阶乘数* @return*/public static int factorialTest1(int a){int sum = 1;for (int i = 1 ;i<=a;i++)sum *=i;return sum;}
结果
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4O0lGFp-1677668556239)(递归算法.assets/image-20221102101945786.png)]](https://img-blog.csdnimg.cn/ea4bcc2e29854041946b8244c6fc9415.png)
分析递归
通过栈角度来理解递归方法的调用过程
栈(后进先出)(先进后出)原则
第一步
在 factorialTest()方法第一次被调用的时候,参数 a 为 5,走else代码块,执行 a * factorialTest(a - 1),相当于a * factorialTest(3)时栈的状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJASAHvY-1677668556240)(递归算法.assets/image-20221102103119292.png)]](https://img-blog.csdnimg.cn/f3d8ddc29f974403998861e31fa911c7.png)
第二步
返回值存储器时没有返回值的,在调用factorialTest(4)后,栈的状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FojsuyV-1677668556240)(递归算法.assets/image-20221102103911724.png)]](https://img-blog.csdnimg.cn/2c31ff38738f4e5bbdcfb6d357b77ff6.png)
第三步
返回值存储器时没有返回值的,在调用factorialTest(3)后,栈的状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-feG8AUrL-1677668556241)(递归算法.assets/image-20221102104257635.png)]](https://img-blog.csdnimg.cn/bedc4f1c0d954c8f994676a88c1949a3.png)
第四步
返回值存储器时没有返回值的,在调用factorialTest(2)后,栈的状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4rsbyjK-1677668556241)(递归算法.assets/image-20221102105140879.png)]](https://img-blog.csdnimg.cn/602f8220cded41108f7854d3888416a5.png)
第五步
返回值存储器时没有返回值的,在调用factorialTest(1)后,栈的状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mG0E5hRM-1677668556242)(递归算法.assets/image-20221102105051430.png)]](https://img-blog.csdnimg.cn/af1e937b76284d7fb043d4139fc9d684.png)
第六步
返回值存储器时没有返回值的,在调用factorialTest(0)后,栈的状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0Xrg910-1677668556242)(递归算法.assets/image-20221102105303893.png)]](https://img-blog.csdnimg.cn/dbe1c4e30d824373969e9be841b319de.png)
最后符合符合if条件,有返回值
栈的后进先出原则,进行阶乘
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMJO7sfd-1677668556243)(递归算法.assets/image-20221102110500842.png)]](https://img-blog.csdnimg.cn/6408d87256de4ee0aeba87a0f8e50185.png)
递归代码虽然只用一份,单执行的过程中,每调用一次就会入栈一次,生成不同的参数,局部变量即返回地址;
