递归是一个过程或函数直接或间接调用自身的方法,它可以把一个大型的问题层层转化为一个与原问题相似但规模较小的问题来求解,递归的结构清晰,可读性强,容易用数学归纳法来证明其算法正确性,但效率低,无论是时间还是占用的空间都比非递归算法要多。
下面是针对繁殖问题的四个具体实例
- 母牛从第4年起每年生一头小母牛,并且母牛不会死,编程求第n年末母牛数
import java.util.Scanner;
public class Cow {
public static int CalcCow(int year)
{
if(year < 0) return 0;
else if(year == 0||year == 1||year == 2||year == 3) return 1;
else return CalcCow(year-1)+CalcCow(year-4);
//(year-1)表示前一年的母牛数、(year-4)表示四年前出生的小母牛可以生育小牛了
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.print("请输入第几年末:");
int year = scan.nextInt();
System.out.println(year+"年末有母牛数::"+CalcCow(year));
}
}
- 有一个农场有一头成年母牛,每三个月后一头小牛,小牛一年后长大,长大后每三个月又可以生一头小牛,如此循环,问n年后农场一共有多少牛
import java.util.Scanner;
public class Cow2 {
public static double CalcCow(double year)
{
if(year < 0) return 0;
else if(year == 0) return 1;
else if(year == 0.25) return 2;
else if(year == 0.5) return 3;
else if(year == 0.75) return 4;
else return CalcCow(year-0.25)+CalcCow(year-1);
//(year-0.25)表示前三个月的母牛数、(year-1)表示一年前出生的小母牛可以生育小牛了
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.print("请输入第几年末:");
double year = scan.nextInt();
System.out.println(year+"年末有母牛数::"+CalcCow(year));
}
}
- 有一个母羊,第2年和第4年可以生一头小母羊,在第5年死去,小母羊在它出生的第2年和第4年生小母羊,第5年死去,求第n年末母羊数
import java.util.Scanner;
public class Sheep {
public static int CalcSheep(int n) {
if(n<0) return 0;
else if(n==0||n==1) return 1;
else return (n>=5?0:1)
+ CalcSheep(n-2)
+ CalcSheep(n-4);
//(n-2)、(n-4)表示两年前和四年前出生的小母羊 才可能生育小羊
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.print("请输入第几年末:");
int year = scan.nextInt();
System.out.println(year+"年末有母羊数::"+CalcSheep(year));
}
}
- 一对小兔子一年后长成大兔子;一对大兔子每半年生一对小兔子。大兔子的繁殖期为4年,兔子的寿命是6年,假定第一年年初投放了一对小兔子,试编程计算,第n年末总共会有多少对兔子
import java.util.Scanner;
public class Rabbit {
static int CalcRabbit(double year)
{
if (year < 0)
return 0;
else if ((year == 0.0) || (year == 0.5))
return 1;
else
{
//1岁开始有繁殖能力,5岁以后没有繁殖能力,6岁以后死亡
return (year >6 ? 0 : 1)//寿命6年
+ CalcRabbit(year - 1)
+ CalcRabbit(year - 1.5)
+ CalcRabbit(year - 2)
+ CalcRabbit(year - 2.5)
+ CalcRabbit(year - 3)
+ CalcRabbit(year - 3.5)
+ CalcRabbit(year - 4)
+ CalcRabbit(year - 4.5)
+ CalcRabbit(year - 5);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
System.out.print("请输入第几年末:");
double year = scan.nextInt();
System.out.println(year+"年末有兔子对数:"+CalcRabbit(year));
}
}
主要就是一点,要计算第n次繁殖后的数量,其实就是计算n-1次繁殖后的数量+第n次开始有繁殖能力的数量,再设好初始状态的值就好了