zoukankan      html  css  js  c++  java
  • 穷举算法和递推算法(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));
        }
    }
  • 相关阅读:
    Lab IGMP
    IGMP知识要点
    15、通过例子讲解逻辑地址转换为物理地址的基本过程
    14、一个程序从开始运行到结束的完整过程,你能说出来多少?
    13、进程状态的切换你知道多少?
    12、虚拟技术你了解吗?
    11、动态分区分配算法有哪几种?可以分别说说吗?
    线程池
    10、内存交换和覆盖有什么区别?
    9、如果系统中具有快表后,那么地址的转换过程变成什么样了?
  • 原文地址:https://www.cnblogs.com/chengxuyuanzhilu/p/6408836.html
Copyright © 2011-2022 走看看