一)递归介绍

定义:

1、在函数体中直接或间接的调用自身的一种方法。

2、必须要有边界值,也就是停止的条件。

头递归:函数调用时不是传递本次计算的结果,而是把当前的调用状态传递,相当于要一直记录上一次函数的调用状态。这种方式会耗内存资源,当计算的值较大,递归层次较深时,容易报内存错误。

尾递归:函数调用时传递本次计算的结果,不需要记录函数的调用状态,由于一直是在尾部计算,大大减少了资源占用。

备注:递归也不是能无限计算下去的,只要是计算,就会有计算瓶颈限制。如果要一直计算,递归和死循环就差不多了。

二)递归案例

(一)计算球的反弹高度和总路径?

描述:一个球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

普通方式:h代表初始高度,n代表反弹次数

public static double fn(double h, int n) {if (h<=0 || n<=0) {return 0;}double sum = 0;while (n>0) {sum += h;h = h/2;n--;}return sum;
}

尾递归方式(该案例不适合用头递归):

h代表初始高度,n代表反弹次数(如需计算第10次总高度,n=11,因为每次是先减1,再求和),sum表示总共的高度。

// h代表初始高度,n代表反弹次数(如需计算第10次总高度,n=11,因为每次是先减1,再求和),sum表示总共的高度
public static double fn(double h, int n, double sum) {if (h<=0 || n<=0) {return 0;}if (n <= 1) {return sum;}return fn(h/2, n-1, sum + h);
}

计算并分解的步骤如下:

高度                  次数    总共米数

fn(100,              10,      0)

fn(50.0,              9,       100.0)

fn(25.0,              8,       150.0)

fn(12.5,              7,       175.0)

fn(6.25,              6,        187.5)

fn(3.125,            5,        193.75)

fn(1.5625,          4,        196.875)

fn(0.78125,        3,        198.4375)

fn(0.390625,      2,        199.21875)

fn(0.1953125,    1,        199.609375)

总共经过199.609375米,第10次反弹高度为0.1953125

(二)阶乘计算

描述:计算从1到n每个数相乘的结果。公式:1*2*3*4*......*n的结果。

普通方式:

public static int fn(int n) {int sum = 1;for(int i=1; i<n; i++) {sum = sum * (i+1);}return sum;
}

头递归方式:

public static int fn(int n) {return n==0 ? 1 : n * fn(n-1);
}

假设n=5,计算并分解的步骤如下:

fn(5)

{5 * fn(5-1)}

{5 * {4 * fn(4-1)}}

{5 * {4 * {3 * fn(3-1)}}}

{5 * {4 * {3 * {2 * fn(2-1)}}}}

{5 * {4 * {3 * {2 * {1 * fn(1-1)}}}}}

{5 * {4 * {3 * {2 * {1 * 1}}}}}

{5 * {4 * {3 * {2 * 1}}}}

{5 * {4 * {3 * 2}}}

{5 * {4 * 6}}

{5 * 24}

{120}

结果返回120

尾递归方式:

public static int fn(int n, int sum) {return n == 0 ? sum : fn(n-1, n*sum);
}

假设n=5,sum初始为1(如果是阶加,初始为0)

计算并分解的步骤如下:

fn(5, 1)

fn(4, 5)

fn(3, 20)

fn(2, 60)

fn(1, 120)

结果返回sum=120

(三)斐波那契数列

描述:斐波那契数列,数列为1,1,2,3,5,8,13,21......n,每一个数是前面两个数之和,计算第n个数是多少。

普通方式:

public static int fn(int n) {int a = 1;int b = 1;int num = 0;for (int i=2; i<n; i++) {num = a+b;a = b;b = num;}return num;
}

头递归方式:

public static int fn(int n) {return n<=2 ? 1 : fn(n-1) + fn(n-2);
}

假设n=6,计算并分解的步骤如下:

fn(6)

{fn(5) + fn(4)}

{fn(4) + fn(3) + {fn(3) + fn(2)}

{fn(3) + fn(2) + fn(2) + fn(1) + fn(2) + fn(1) + 1}

{fn(2) + fn(1) + 1 + 1 + 1 +1 + 1 + 1}

{1+ 1 + 1 + 1 + 1 +1 + 1 + 1}

第6个数结果为:8

尾递归方式:

// 写法一:假设n等8, n = fn1(8, 1, 1);
public static int fn1(int n, int num1, int num2) {return n == 1 ? num1 : fn1(n - 1, num2, num1 + num2);
}// 写法二:假设n等8, n = fn2(1, 1, 8);
public static int fn2(int first, int second, int n) {return n < 3 ? second : fn2(second, first + second, n - 1);
}

假设n=6,计算并分解的步骤如下:

fn2(1, 1, 6)

fn2(1, 2, 5)

fn2(2, 3, 4)

fn2(3, 5, 3)

fn2(5, 8, 2)

第6个数结果为:8

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

几道经典递归算法案例相关推荐

  1. 传统程序员如何学习机器智能?阿里公开11个经典实战案例

    作为一名技术人,你是否曾有过这样的疑惑: 机器智能大热,作为一名传统程序员,该如何转型或学习? 网上AI教程.书籍,质量参差不齐,如何找到真正专业的资源? AI理论遍地皆是,但几乎都在纸上谈兵,该从哪 ...

  2. python经典程序实例-你不知道的Python语言的经典五大案例

    原标题:你不知道的Python语言的经典五大案例 身为全国三大主流编程语言之一,Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库.Python的简单入门及其它的全能型,能适应所 ...

  3. python历年来经典项目实例-你不知道的Python语言的经典五大案例

    原标题:你不知道的Python语言的经典五大案例 身为全国三大主流编程语言之一,Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库.Python的简单入门及其它的全能型,能适应所 ...

  4. linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用 ...

  5. [ZZ]知名互联网公司Python的16道经典面试题及答案

    知名互联网公司Python的16道经典面试题及答案 https://mp.weixin.qq.com/s/To0kYQk6ivYL1Lr8aGlEUw 知名互联网公司Python的16道经典面试题及答 ...

  6. python项目实例初学者-经典Python案例,初学者的小帮手,立马学会Python!

    原标题:经典Python案例,初学者的小帮手,立马学会Python! 对于刚开始学习Python的人来说,会通过Python的一些经典案例练手,这样既可以加深对Python的理解,也可以增进自己的技术 ...

  7. PE经典DIY案例1:全解开方案让量产PE也能

    更新说明:因未来的uefi似乎并不能识别并引导ud区,但能识别和引导量产和u+B+隐藏或高端隐藏区,故解决量产PE对u+B+隐藏区的支持,并增加对UEFI启动支持,已经成为PE制作的最主流技术. PE ...

  8. python全排序算法题_Python的100道经典算法题(1)

    按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...

  9. MySQL数据库“十宗罪”(十大经典错误案例)

    各位技术老铁们,福利来了!今天给大家说说<数据库中十大经典错误案例> 老张我在刚开始学习数据库的时候,没少走弯路.经常会遇到各种稀奇古怪的 error 信息,遇到报错会很慌张,急需一个解决 ...

最新文章

  1. integer比较_Java整数缓存Integer.valueOf(127)==Integer.valueOf(127)为True
  2. matlab离散系统 响应,离散系统的频率响应和输出响应的matlab实现
  3. Why Accuracy Is So Important for Distinct Counting
  4. js插件---webuploader 使用(lavarel中使用)
  5. 模糊数学笔记:五、模糊聚类
  6. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 ——材料清单
  7. css expression
  8. 基于Android平台淘宝网手机客户端实战开发(共四季,涉及各类技术应用)
  9. Java基础学习总结(176)——JDK 16 正式发布,一次性发布 17 个新特性
  10. 算法笔记_面试题_16. 二叉树相关_模板及示例十几道
  11. linux-vim快捷键
  12. 苹果NFC功能以及Apple Pay的初探
  13. mac pdf去水印_mac如何去除视频水印
  14. Linux下安装vim编辑器
  15. 发现一本数学好书——重温微积分
  16. 【源码分析】Spring Boot中Relaxed Binding机制的不同实现
  17. JAVA工具_PinyinConv
  18. 彻底删除win7无线临时网络
  19. java毕业设计开题报告jsp企业电子投票系统|问卷
  20. 10-Ubuntu-ftp客户端

热门文章

  1. 最大质因数 matlab,试题 算法训练 最大质因数
  2. SQL将两列合并为一列
  3. 如何用计算机的思维去思考问题?
  4. 关于Recycle.exe病毒的分析
  5. 做邮件服务系统的一点心得
  6. VassistX自定义快捷代码
  7. oracle异常抛出,ORACLE 存储过程异常捕获并抛出
  8. 卸载“趋势科技防毒墙网络版客户机”方法之一
  9. foxmail pop3服务器能收邮件,发不了邮件,为什么我现在用foxmail只能收126的邮件,但是发送说无法连接到服务器POP3 SMTP设置是正确...
  10. 无法安装Apple mobile device support 导致ipad(iphone)无法连接itunes的解决办法