二级结论高中数学 递归数列

递归序列(中学结论高中数学)原始数据结构与算法2020-08-10 10:19:13
什么是递归?在讲递归之前,我们先来看看递归 。递归就是在运行的过程中调用自己 。
递归的条件如下:1 。子问题必须与原问题相同,且更简单;2.你不能无限期地称呼自己 。必须有出口,简化为非递归条件处理 。
递归语言的例子让我们用两个故事来解释什么是递归 。
1.从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事!有什么故事?“从前,有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事!有什么故事?从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事!有什么故事?……'"
2.大雄在自己房间里,用时光电视看往事 。当时在电视画面中,他在自己的房间里,看着过去的时光电视 。当时的电视屏幕出现在电视屏幕上,他正在自己的房间里,看着时间电视上过去的情形...
递归模板我们知道递归必须有两个条件,一个是调用自身,一个是有终止条件 。这两个条件必须同时满足,一个都不能少 。并且终止条件必须在递归的开始,如下 。
publicvoidrecursion(参数0){if(终止条件){return;}recursion(参数1);}你不能把终止条件写在递归的末尾 。下面的写法不对 。
publicvoidrecursion(参数0){recursion(参数1);if(终止条件){return;}}在这种情况下,递归永远不会后退,并且会发生StackOverflowError 。
但实际上递归可能不止一次调用自己,很多递归在调用之前或之后都会有一些逻辑处理,比如下面 。
publicvoidrecursion(参数0){if(终止条件){return;}可能有一些逻辑运算recursion(参数1)可能有一些逻辑运算recursion(参数2)……recursion(参数n)可能有一些逻辑运算}
实例分析我对递归的理解是一层一层往下传,满足终止条件就会反弹,最终会反弹到调用的地方 。我们拿五个最常见的例子来分析一下 。
1,阶乘
我们先来看看最简单的递归调用——阶乘 。代码如下所示
publicintrecursion(intn){if(n==1)return1;returnn*recursion(n-1);5}这种递归太熟悉了 。第2-3行是终止条件,第4行是给自己打电话 。我们来画一个n = 5时的图,看看递归是怎么调用的 。
如果看不清楚,点击放大图片 。
这种递归还是很简单的 。当我们找到f(5)时,我们只需要找到f(4) 。如果我们找到f(4),我们将要求f (3)...,层层调用 。当n=1时,我们会直接返回1,然后逐层返回,直到返回f(5) 。
【二级结论高中数学 递归数列】递归的目的是将一个大问题细分成更小的子问题 。我们只需要知道递归函数的作用,不要一层一层的去想递归 。如果同时调用几次,很可能会陷入循环,出不来 。比如上面问题中需要f(5),我们只需要计算f(4),即F(5)= 5 * F(4);至于f(4)是怎么算出来的,先不说了 。因为我们知道f(n)中的n可以表示任意正整数,所以只需要传入4就可以计算f(4) 。
2.斐波那契数列
我们再来看另一个经典的递归问题,就是斐波那契数列 。该序列的前几项如下
[1,1,2,3,5,8,13……]
我们参考递归模板把它写下来 。第一个终止条件是当n等于1或2时返回1,即序列的前两个值为1 。代码如下所示
publicintfibonacci(intn){if(n==1||n==2)return1;这里是递归调用;}递归的两个条件,一个是终止条件,我们已经找到了 。另一种是给自己打电话 。我们知道斐波那契数列的当前值是前两个值之和,也就是
斐波那契(n)=斐波那契(n - 1) +斐波那契(n - 2)
所以代码很容易写 。
//1,1,2,3,5,8,13……publicintfibonacci(intn){if(n==1||n==2)return1;returnfibonacci(n-1)+fibonacci(n-2);}3.河内塔
通过对前两个例子的分析,我们对递归有了一个大致的了解 。再来看另一个例子——河内塔 。其实这个之前已经提过了 。有兴趣的可以去河内塔362看看 。
这里简单说一下汉诺塔的原理,就是有A、B、c三根柱子,A盘在柱子上从上到下从小到大排列 。通过B列将A列上的磁盘全部移动到C列,移动的过程永远是小盘在上,大盘在下 。让我们递归地解决这个问题 。我们先定义一个函数 。
Public void Hanoi (int n,char a,char b,char c)他的意思是在b的帮助下成功地将n个磁盘从A移动到C 。
我们先来回顾一下递归的条件 。一个是终止条件,一个是给自己打电话 。我们先来看递归的终止条件,即当n等于1时,也就是A列只有一个磁盘时,我们可以直接把A列的磁盘移到c列 。
//表示的是把n个圆盘借助柱子B成功的从A移动到Cpublicstaticvoidhanoi(intn,charA,charB,charC){if(n==1){//如果只有一个,直接从A移动到C即可System.out.println("从"+A+"移动到"+C);return;}这里是递归调用}我们再来看看递归调用 。如果n不等于1,我们就要把它分成3步 。

推荐阅读