函数递归总结

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);

    }

扫描二维码关注公众号,回复: 1728134 查看本文章

(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;

3.>n=3时, 移动方式:  我们需要把上面两个2,借助c塔,移动到b塔上,然后把a塔的最大的盘移动到c塔,再借助a塔把b塔的两个盘移动到c塔(调用f (2)函数)

java实现代码如下:

import javax.swing.JOptionPane;


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);
}
}


 

猜你喜欢

转载自blog.csdn.net/qauchangqingwei/article/details/80781609