java递归1加到10,递归1-初识递归.pdfVIP

  • 1
  • 0
  • 约3.07千字
  • 约 4页
  • 2023-12-31 发布于中国
  • 举报

java递归1加到10,递归1-初识递归

才毕业的开发⼩⽩,最近在使⽤node、php和vue,有兴趣的⼩伙伴可以加群134246716,⼤家⼀起学习,这是⼀个新建群,有兴趣的

初学者可以来⼀起学习哦。

I.递归简论

递归的概念

当⼀个函数⽤它⾃⼰来定义时就称为是递归(recursive)的。

递归的基本法则

当编写递归程序时,关键是要牢记递归的四条基本法则:

1.基准情形(basecase)。必须总要有某些基准情形,它⽆需递归就可以解出。

2.不断推进(makingprogress)。对于那些需要递归的求解的情形,每⼀次递归调⽤都必须要使情况朝向⼀种基准情形推进。

3.设计法则(designrule)。假设所有的递归调⽤都能运⾏。

4.合成法则(compoundinterestrule)。在求解⼀个问题的同⼀实例时,切勿在不同的递归调⽤中做重复性的⼯作。

使⽤递归计算诸如斐波那契数之类简单数学函数的值的想法⼀般来说不是⼀个好主意,其道理正是根据第四条法则。

II.递归与数学归纳法

数学归纳法的思想

⼀般地,证明⼀个与⾃然数n有关的命题P(n),有如下步骤:

(1)证明当n取第⼀个值n0时命题成⽴;

(2)假设当n=k(k⩾n0)时命题成⽴,证明当n=k+1时命题也成⽴。

综合(1)(2),对⼀切的⾃然数n(n⩾n0),命题P(n)都成⽴。

其实,数学归纳法利⽤的是递推的原理,可以形象地叫做多⽶诺原理。数学归纳法的关键就是如何证明当n=k+1时命题也成⽴。

递归的思想

很明显,递归也是⽤了递推的思想。

(1)⾸先,我们需要⼀个递归的出⼝,即basecase;

(2)其次,是递归体的设计,即对于⼀个⼀般的情况如何向basecase靠近,把它化解成为⼀个更⼩的,同样结构的问题。

递归的关键就是将问题转化成⼀个更⼩规模的同样结构的问题。

III.递归的经典例⼦

n!的递归算法

求解n!是最经典⼊门的递归算法。根据前⾯的知识我们知道⽤递归解决这个问题,需要两个要点。⾸先,如何将⼀个⼤的问题转化成⼀个

⼩规模的问题?我们知道,n!=n(n−1)!,那么根据这个公式,我们就可以轻易地将求解n!转化为求解(n−1)!(将问题的规模变⼩了,

并且是同样的问题)。其次,如何找到basecase,即递归的出⼝呢?在该问题⾥⾯也是很明显的,最后求1!时,就不需要在递归了。所

以,该递归算法可以写为:

intfactorial(intn){

if(n==1)

return1;//basecase

returnn*factorial(n−1);//makingprogress

}

汉诺塔的递归算法

如下图所⽰,从左到右A、B、C三根柱⼦,其中A柱⼦上⾯有从⼩叠到⼤的n个圆盘。现要求将A柱⼦上的圆盘移到C柱⼦上去,期

间只有⼀个原则:⼀次只能移到⼀个盘⼦且⼤盘⼦不能在⼩盘⼦上⾯,求移动的步骤和移动的次数。

汉诺塔⽰意图.png

1.算法分析:

当A柱⼦上只有⼀个盘⼦时,可以直接把盘⼦移到C柱⼦上;当A柱⼦上有两个盘⼦时,需要借助B盘⼦,先将上⾯的⼩盘⼦移到B柱⼦

上,再将⼤盘⼦移到C柱⼦上,再将⼩盘⼦移到C柱⼦上。那对于更⼀般的情况,当有n个盘⼦的时候怎么递归呢?当有n个盘⼦时,我

们可以将盘⼦看成两个部分。第n个盘⼦和上⾯n−1个盘⼦,如图中的颜⾊区分。就像是操作两个盘⼦(把前n−1个盘⼦看成⼀个整

体):先把前n−1个盘⼦从A盘放到B盘,再把第n个盘⼦从A盘放到C盘,最后再把前n−1个盘⼦从B盘放到C盘。这样我们就

把问题的规模缩⼩到n−1了。

2.算法的Java实现:

/**

*@Author:落脚⼂

*@Date:2017/10/14

*@Time:下午8:33

*@ClassName:HanoiTower

*@Description:汉诺塔的递归算法

*/

importjava.util.Scanner;

publicclassHanoiTower{

privatestaticintstep=0;//记录步数

publicstaticvoidmain(String[]argus){

Scannerscanner=newScanner(System.i

文档评论(0)

1亿VIP精品文档

相关文档