递归
函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。
1.递归的思想
把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。
2.递归的使用方法
1.找到递归关系,即把一个复杂的问题转化为与它形式相似、但规模较小的问题
2.找到递归出口,即问题转化时,当规模足够小,可以直接求解
3.递归函数的调用过程
4.求阶乘问题
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
亦即n!=1×2×3×…×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
递归方法的要点是一定要有递归结束条件,也就是上面代码里的 x==1,否则就会一直递归,最终超过允许的最大递归次数而出错。
5.斐波那契数列
兔子繁殖问题:
在700多年前,意大利著名数学家斐波那契在《算盘全集》中提到这样一个问题:一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,第n个月有多少对兔子?
F(1)=1
F(2)=1
F(3)=F(1)+F(2)=1+1=2
F(4)=F(2)+F(3)
…………
F(N)=F(N-2)+F(N-1)
代码
6.汉诺塔
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞n片黄金圆盘。大梵天命令婆罗门把圆盘从下自上开始、按大小顺序重新摆放在另一根柱子上。并且规定,小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,如图所示。问应该怎样移动,才能将圆盘移动到另一根柱子上。
(1)开始的图样和最后要达到的图像
(2)步骤1:将A柱上的绿色圆盘移动到C柱上,移动过程示意图如图所示。
(3)步骤2:将A柱上的黄色圆盘移动到B柱上,移动过程示意图如图所示。
(4)步骤3:将C柱上的绿色圆盘移动到B柱的黄色圆盘上,移动过程示意图如图所示。
(5)步骤4:将A柱上的红色圆盘移动到C柱上,移动过程示意图如图所示。
(6)步骤5:将B柱上的绿色圆盘移动到A柱上,移动过程示意图如图所示。
(7)步骤6:将B柱上的黄色圆盘移动到C柱上,移动过程示意图如图所示。
(8)步骤7:将A柱上的绿色圆盘移动到C柱上,移动过程示意图如图所示。
这就是将3层圆盘按照规定移动到另一根柱上的整个过程。不论是3层还是4层还是n层,移动的算法都是这样的,首先是将A柱最上方的n-1个圆盘落在B柱,将此时A柱的最小圆盘落在C柱,B柱上的n-1个圆盘,落在C柱。