函数递归总结
1 函数递归的定义:函数自己直接或者间接的调用自己的函数,直到满足一个条件结束自己调用自己的函数的过程。每次调用函数都会开辟新的空间,递归调用可以看做是函数的嵌套调用。
2 递归算法的设计基本思想:对于一个复杂的问题:把原问题分解成相对简单的若干子问题,继续下去,直到子问题简单到能够直接求解。也就是到了递归的结束条件,也叫递归出口。
3 关键处:递归出口,逐步向出口逼近。
4 递归缺点:运行效率低。不建议使用。
5 递归的实例:
(1)斐波那契数列(黄金分割数列)
例如:1,1,2,3,5,8,13..........在数学上,斐波那契数列被递归这样定义:F(0)=0;F(1)=1;F(n)=F(n-1)+F(n-2),(n>=2);
现在用递归求第100个数。
代码如下:
static int count(int n){
if(n==1||n==2) {
return 1;
}
return count(n-1)+count(n-2);
}
public static void main(String args[])
{
int sum=count(100);
System.out.println(sum);
}
(2)求解阶乘。例如求解100的阶乘
代码如下:
public class Digui {
public static int digui(int n){
if(n==1||n==0){
return n;
}else{
System.out.println("执行第" + n + "次");
return n*digui(n-1);
}
}
public static void main (String[] args){
System.out.print(digui(100));
}
(3) 汉塔问题
问题的描述: 假设有三个命名为a,b,,c塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。现要求将a塔座上的n个圆盘移到c塔座上并按同样顺序叠排。
圆盘移动的时候必须遵循以下的规则:
1> 每次只能有一个圆盘移动。
2>圆盘可以插在a,b,c任意三个柱子上。
3> 任意时刻不能把较大的圆盘放到较小的圆盘上面。
算法分析:
1> n=1时,移动方式为 a——>c;
2>n=2时,移动方式为 a——>b,a——>c,b——>c;
public class HanoiTemple {
/**
* @changqingwei 2018.6.23
*/
public static void main(String[] args) {
String n=JOptionPane.showInputDialog("请输入要移到的盘数:");
HanoiTemple ht=new HanoiTemple();
ht.move(Integer.parseInt(n),'A','B','C');
}
public void move(int n,char a,char b,char c){
if(n==1){
System.out.println("move from "+a+" to "+c);
}else{
move(n-1, a,c,b);
move(1, a, b, c);
move(n-1, b, a, c);
}
}