递归的经典问题

问题之一:斐波那契数列

斐波那契数列:1 1 2 3 5 8 13 21 34 .....求第20个数字

解题思路:通过观察上述数列我们可以发现前两项之和等于第三个数依次类推,最后一项f(n)=f(n-2)+f(n-1)

以5个数为例,如下图所示

先从第五个数不断往下化,f(5)=f(4)+f(3),f(4)=f(3)+f(2),f(3)=f(2)+f(1),找出最小条件,当该数字为1时它的值也为1,否则就输出f(n)=f(n-1)+f(2),在这道题中需要注意n=1和n=2的数值都是1

import java.util.*;
class demo1{
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.print("请输入一个数");
        int n=s.nextInt();
        for(int i=1;i<=n;i++){
            System.out.println(fibo(i));
        }
    }
    public static int fibo(int n){
        if(n==1||n==2){
            return 1;
        }
        return fibo(n-1)+fibo(n-2);
    }
}

问题二  汉诺塔问题

汉诺塔是迭代最经典的问题之一,它是由3根柱子,第一个柱子上有64个从小到大的圆环,要求从第一个柱子上将圆环移到带三个柱子上,要求,小环不能在大环之上,我们所要求的圆环移动的路程。

解题步骤:下面是我以三个圆环为例所做的动图

如果是64个圆环的话我们可以将前62个圆环看做一个,就是三个圆环,再可以将前60个圆环看做一个,依次类推,不断向前化,最后就剩三个圆环。以三个圆环为例,我们可以看到如果是一个圆环的话可以直接从第一个直接移到第三个柱子路径为(begin->end),如果是两个圆环的话,先将第一个圆环移到第二个柱子上,再将第二个圆环移到第三个柱子上,最后将第一个圆环移到第二个柱子上,第一个圆环的路径为(begin->mid->end)第二个圆环的路径为(begin->end),如果是三个圆环的话,先将第一个圆环从第一个柱子移到第三个柱子上,再将第二个圆环从第一个柱子移到第二个柱子上,然后将第一个圆环移到第二个柱子上,再将第三个圆环从从第一个柱子移到第三个柱子上,将第一个圆环移到第一个柱子上,将第二个圆环移到第三个柱子上,最后将第一个圆环移到第三个柱子上,第一个圆环的路径为(begin->end->mid->begin->end)第二个圆环的路径为(begin->mid->end)第三个圆环(begin->end)那么我们就可以得出如果只有一个圆环话路径就是(begin->end), 当两个圆环时路径为(begin->mid->end)当三个圆环时路径就为(begin->end->mid->begin->end)具体代码如下

import java.util.*;
class demo2{
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.print("请输入一个数");
        int a=s.nextInt();
        f(a,"x","y","z");
    }
    public static void f(int n,String begin,String mid,String end){
        if(n==1){
            System.out.println(begin+"->"+end);
        }else{
            f(n-1,begin,end,mid);
            System.out.println(begin+"->"+end);
            f(n-1,mid,begin,end);
        }
    }
}
发布了21 篇原创文章 · 获赞 0 · 访问量 362

猜你喜欢

转载自blog.csdn.net/weixin_44318477/article/details/104318165
今日推荐