穷举算法和递推算法(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月份才可以产崽子。那么假定一年内没有发生死亡事件,那么现在有一对小兔子一年后共有多少对兔子。
案例分析:
1月 1对兔子
2月 1对兔子
3月 2对兔子 一对成熟兔子
4月 3对兔子
5月 5对兔子 两对成熟兔子
6月 8对兔子 三对成熟兔子
。。。。。。
规律:前两个月都是一对兔子,以后每个月的兔子的对数是前两个月的总和
除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)); } }