穷举算法和递推算法(Java)

穷举算法

概念:

最简单算法,依赖计算机的强大计算能力穷尽每一种可能的情况。穷举算法效率不高,但是适合一些没有明显规律可循的场合。

 

思想:

在使用穷举算法时,需要明确问题答案的范围,这样才可能在指定范围搜索答案。指定范围之后,就可以使用循环和条件判断语句进行逐步验证结果了。

 

案例:鸡兔同笼问题

在一个笼子里关着若干只鸡和若干兔子。一共有35个头,和94只脚。问在一个笼子里鸡和兔子各有多少个。

 

package cmd.chengxuyuanzhilu.arithmetic;

import java.util.Scanner;

/**
 * @author 微信公众号:程序员之路 
 *                 博客:http://www.cnblogs.com/chengxuyuanzhilu/
 * 穷举算法
 */
public class Exhaustion {
    public static void exhaustion(int head,int foot){
        int chicken,rabbit;
        for(chicken=0;chicken<= head;chicken++){
            rabbit=head-chicken;
            if(chicken*2+rabbit*4 == foot){
                System.out.println(String.format("鸡有 %d只,兔子有%d只", chicken,rabbit));
            }
        }
    }
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        int head,foot;
        
        System.out.println("穷举算法解决鸡兔同笼问题");
        System.out.println("输入头的个数");
        Scanner scanner = new Scanner(System.in);
        head = scanner.nextInt();
        System.out.println("输入腿的个数");
        foot = scanner.nextInt();
        exhaustion(head, foot);
    }
}

 

递推算法

概念:

递推算法在数学计算等方面广泛应用。递推算法适合有着明显规律的场合

 

思想:

递推算法往往需要用户知道答案和问题之间的逻辑关系。在许多数学问题中,都有着明显的计算公式可以遵循,因此可以采用递推算法。

 

案例:兔子产崽子的问题

如果有两个月大的兔子以后每个月都可以产一对小兔子,而一对小兔子出生两个月后可以在生小兔子,也就是1月份出生,3月份才可以产崽子。那么假定一年内没有发生死亡事件,那么现在有一对小兔子一年后共有多少对兔子。

 

案例分析:

11对兔子

21对兔子

32对兔子 一对成熟兔子

43对兔子

55对兔子 两对成熟兔子

68对兔子 三对成熟兔子

。。。。。。

规律:前两个月都是一对兔子,以后每个月的兔子的对数是前两个月的总和

1,2月份的计算公式:n月  Fn = (Fn-1)+(Fn-2)

 

package cmd.chengxuyuanzhilu.arithmetic;

import java.util.Scanner;

/**
 * @author 微信公众号:程序员之路 
 *                 博客:http://www.cnblogs.com/chengxuyuanzhilu/
 * 递推算法
 */
public class Recurrence {
    public static int recurrence(int months){
        if( months == 1 || months == 2){
            return 1;
        }else{
            int m1 = recurrence(months-1);
            int m2 = recurrence(months-2);
            return m1+m2;
        }
    }
    
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        int months,rabbits;
        
        System.out.println("递推算法解决兔子生崽子的问题");
        System.out.println("输入月数");
        Scanner scanner = new Scanner(System.in);
        months = scanner.nextInt();
        rabbits = recurrence(months);
        System.out.println(String.format("%d月共有兔子%d对", months,rabbits));
    }
}

 

posted @ 2017-02-17 10:52  RedAnts  阅读(6134)  评论(0编辑  收藏