数羊问题
题设:假设有N个母羊,每个羊在第二年可以生下一母羊,第四年可以生下一母羊,第五年时候羊死亡?问,在接下来的m年内,羊圈里总共有多少只母羊?
解题思路:N个母羊都是同一天开始生育的,也就是说我们只要算出一个母羊在M年内能生育多少并存活的数量SUM,就可以用N*SUM算出M年后有多少个羊;
题设给出,一个母羊可以存活五年,在存活周期的第二年可以生出一个母羊,而这第二个母羊也可以继续生育,也就是说分成了两份,而两份的生命周期改变了;同理第四年生的羊也可以这样考虑,只要考虑其生命周期就能得到想要的结果;
那岂不是说,生命周期小于等于m-3年内的羊,都可以产两子,而自己死亡;生命周期在m-3到m-1内的羊产一子,而自己不死亡;生命周期大于m-1的羊,不生育不死亡;
那么题解来了,递归就可以解决:
给出代码如下所示:
package writtenExamination;import java.util.Scanner;public class Main {// sum(1,m)从第一年开始,一个羊可以生育的羊数量总和private static int sum(int i, int m) { // i表示当前生命周期位数if (i <= m-3) { // 表示羊可以再生两个if (i + 4 <= m) return sum(i + 1) + sum(i + 3) - 1; // 减一表示这个羊死了return sum(i + 1) + sum(i + 3);} else if (i <= m - 1) { // 表示羊只能再生产一个,而且此羊还活着return sum(i + 1);} else { // 表示羊不能再生了,并且活着,把自己返回出去return 1;}}/*** 已知母羊在存活期间,可以产下两头幼崽** @param args*/public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 表示初始状态有n个羊int m = scanner.nextInt(); // 表示统计m年内,羊的数量scanner.close(); // 关闭写入流,一般人都不会关这个,但是这个是一个system.in的包装类,一般建议关了int sum = n * sum(1,m);System.out.println(sum);}
}
作者傻逼,这么简单的题竟然笔试的时候做错了。
数羊问题
题设:假设有N个母羊,每个羊在第二年可以生下一母羊,第四年可以生下一母羊,第五年时候羊死亡?问,在接下来的m年内,羊圈里总共有多少只母羊?
解题思路:N个母羊都是同一天开始生育的,也就是说我们只要算出一个母羊在M年内能生育多少并存活的数量SUM,就可以用N*SUM算出M年后有多少个羊;
题设给出,一个母羊可以存活五年,在存活周期的第二年可以生出一个母羊,而这第二个母羊也可以继续生育,也就是说分成了两份,而两份的生命周期改变了;同理第四年生的羊也可以这样考虑,只要考虑其生命周期就能得到想要的结果;
那岂不是说,生命周期小于等于m-3年内的羊,都可以产两子,而自己死亡;生命周期在m-3到m-1内的羊产一子,而自己不死亡;生命周期大于m-1的羊,不生育不死亡;
那么题解来了,递归就可以解决:
给出代码如下所示:
package writtenExamination;import java.util.Scanner;public class Main {// sum(1,m)从第一年开始,一个羊可以生育的羊数量总和private static int sum(int i, int m) { // i表示当前生命周期位数if (i <= m-3) { // 表示羊可以再生两个if (i + 4 <= m) return sum(i + 1) + sum(i + 3) - 1; // 减一表示这个羊死了return sum(i + 1) + sum(i + 3);} else if (i <= m - 1) { // 表示羊只能再生产一个,而且此羊还活着return sum(i + 1);} else { // 表示羊不能再生了,并且活着,把自己返回出去return 1;}}/*** 已知母羊在存活期间,可以产下两头幼崽** @param args*/public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 表示初始状态有n个羊int m = scanner.nextInt(); // 表示统计m年内,羊的数量scanner.close(); // 关闭写入流,一般人都不会关这个,但是这个是一个system.in的包装类,一般建议关了int sum = n * sum(1,m);System.out.println(sum);}
}
作者傻逼,这么简单的题竟然笔试的时候做错了。
发布评论