古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
1.递归解法:
package dataStruct; import java.util.Scanner; /** * @ClassName: RabbitDG * @Description: TODO * @Author: hunterm * @Date: 2019/8/5 16:00 * @Version:1.0 */ public class RabbitDG { long sum = 0; public static void main(String[] args){ System.out.println("请输入月数..."); Scanner sc = new Scanner(System.in); long months = sc.nextLong(); System.out.println("第"+months+"个月,兔子的对数为:"+new RabbitDG().getRabbitSum(months)); } /** * 递归方法 * 1 1 2 3 5 8 13 21 */ public long getRabbitSum(long months){ if(months == 1 || months ==2){ return 1; }else{ return sum = getRabbitSum(months - 1) + getRabbitSum(months - 2); } } }
2.非递归解法
package dataStruct; import java.util.Scanner; /** * @ClassName: Rabbit * @Description: TODO * @Author: hunterm * @Date: 2019/8/5 15:46 * @Version:1.0 */ public class Rabbit { public static void main(String[] args) { System.out.println("请输入月数..."); Scanner sc = new Scanner(System.in); long months = sc.nextLong(); System.out.println("第"+months+"个月,兔子的对数为:"+new Rabbit().get(months)); } /** * 规律:1 1 2 3 5 8 13 21 */ public long get(long months) { long f1 = 1L; long f2 = 1L; long f = 0; if(months == 1 || months == 2){ return 1; } for (int i = 3; i <= months; i++) { f = f2; f2 = f1 + f2; f1 = f; } return f2; } }
递归方法大家都会,所以面试时一般考察非递归方式求解。