一、概述:
递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。类似于数列,通过前几项的值推出后几项
二、递归算法的使用条件
1.大问题可以拆分为若干小问题
2.原问题与子问题除数据规模不同,求解思路完全相同
3、存在递归终止条件
在对于实际问题的考虑中特别要注意当不满足终止条件时,要如何缩小函数值并让其进入下一层循环中
三、递归算法的经典实例
一一问题定义即为递归定义
阶乘
斐波纳契数列
杨辉三角的取值
汉诺塔问题
青蛙跳台阶
●阶乘
算法代码:
public static int fact(int num) //阶乘fact全称Factorial
{
if(num==1)
return num;
else
return num*fact(num-1);
}
●斐波纳契数列
又称黄金数列,指的是这样一个数列:1、1、2、3、5、8、13....
在数学上,斐波那契数列以如下递归方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)
算法代码:
public static int fibonacci(int n){
if(n==1||n==2)//递归终止条件
return 1;
else
return fibonacci(n-1)+fibonacci(n-2);
}
●杨辉三角的取值
public static int get(int n){
if(n==1||n==2)//递归终止条件
return 1;
else
return fibonacci(n-1)+fibonacci(n-2);
}
●汉诺塔问题(简化语言)
一个柱子A上有64的按大小顺序放置的圆片,要全部移动到另一根柱子C上,每次只能移动一个,可以借助柱子B,且小的不能在大的下面。求最少的移动次数。
先让所有圆片从上到下按1到N排序。
当N=1时,只需从A->C,移动1次。
当N=2时,先让1号从A->B,再让2号从A->C,最后让1号从B->C,移动3次。
当N=3时,可以理解为先让1、2号从A->B,再让3号从A->C,最后让1、2号从B->C。因为由N=2可以得知,移动两片需要3次,而A->B,B->C共进行了两次,所以共有6次,再加上3号A->C的过程,要移动7次。
同理,当N=4时,共要移动2×7(N=3的移动次数)+1=15次。
…
所以,当N=N时,要移动2×(N-1)的移动次数+1次
(其实也可以看做2的N次方-1)