Java数据结构----递归练习

Java编程练习(2)--递归


递归是一个过程或函数直接或间接调用自身的方法,它可以把一个大型的问题层层转化为一个与原问题相似但规模较小的问题来求解,递归的结构清晰,可读性强,容易用数学归纳法来证明其算法正确性,但效率低,无论是时间还是占用的空间都比非递归算法要多。
下面是针对繁殖问题的四个具体实例

  1. 母牛从第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));
		
	}

}
  1. 有一个农场有一头成年母牛,每三个月后一头小牛,小牛一年后长大,长大后每三个月又可以生一头小牛,如此循环,问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));	
	}
}

  1. 有一个母羊,第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));
	}

}
  1. 一对小兔子一年后长成大兔子;一对大兔子每半年生一对小兔子。大兔子的繁殖期为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次开始有繁殖能力的数量,再设好初始状态的值就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值