练习一
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月的兔子对数为多少?
请定义方法实现该功能,第n个月由方法的调用者传入,返回该月的兔子对数。调用方法查看结果。
分析:第n个月出生的兔子在n+2个月开始生育,那么第n+2个月的兔子总数为第n天兔子总数(n+2天新出生的兔子数量)和第n+1兔子总数(n+2天非新生兔子的数量)天的和。得到递推公式num(n)=num(n-1)+num(n-1);num(1)=num(2)=1用递推公式和前两项求末项
import java.util.Scanner;
public class Test411 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(rabbit(sc.nextInt()));//方法一
System.out.println(count(sc.nextInt()));//方法二
}
//方法一:循环+数组
public static int rabbit(int month){
int[] numList=new int[month];//创建月份长度的数组,充当数列
numList[0]=numList[1]=1;//前两项值已知
for (int i = 2; i < numList.length; i++) {
numList[i]=numList[i-1]+numList[i-2];//依次求下一月的数量
}
return numList[month-1];//输出末项值
}
//方法二:递归
public static int count(int n){
if (n==1||n==2){
return 1;//前两项值赋值
}
return count(n-1)+count(n-2);//递推公式会反复调用count直到n-2=1时}
}
练习二
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
分析:看到题之后懵了好久,因为正常人来做这道题肯定是解方程组x+y+z=100&&5x+3y+1/3z==100,但我完全想不出来怎么编程解决。
后来想到可以挨个试,于是写出了三层循环挨个试三种鸡的个数,满足条件再输出,这个方法速 度偏慢,于是简化方程为 14x+8y=200&&z=100-x-y,两层循环先求出xy
public class Test411 {
public static void main(String[] args) {
chikenNum();
}
public static void chikenNum(){
a: for (int cock=1;cock<20;cock++){//第一层循环,挨个试x
for ( int len=1;len<34;len++){//第二层循环挨个试y
if (14*cock+8*len==200){//满足条件输出
System.out.println("鸡翁:"+cock);
System.out.println("鸡母:"+len);
System.out.println("鸡雏:"+(100-cock-len));
break;
}
}
}
}
}