(兔子繁殖问题)斐波那契数列:递归非递归解法
题目
假设一对幼年兔子需要一个月长成成年兔子,一对成年兔子一个月后每个月都可以繁衍出一对新的幼年兔子。不考虑死亡的情况,问第 N 个月时共有多少对兔子?
这是一个典型的斐波那契数列问题,即
第一个月有一对兔子;
第二个月兔子长大了,但还是只有一对兔子;
第三个月多了一对幼年兔子,共有两对兔子了;
第四个月又生了一对幼年兔子,同时第三个月的幼年兔子长成了成年兔子;
……
那么兔子数量的规律即:1,1,2,3,5,8,13,21……
设定第 0 个月数量为 0,观察可得,从第 2 个月开始,每个月的兔子数量都等于前两个月兔子数量的和。这就是著名的斐波那契数列。
递归解法
import java.util.Scanner;public class Main {public static void main(String[] args) {System.out.print("请输入月份:");int n = new Scanner(System.in).nextInt();System.out.println("兔子的对数为:" + getNums(n));}public static int getNums(int n) {if (n <= 1) return n;return getNums(n - 1) + getNums(n - 2);}}
这个比较简单易懂,设定 n 为 0 或者 1 的时候为递归的跳出条件,其余情况直接使用递归返回上两个月的数量和即可。
非递归解法
如果不使用递归,那我们需要开辟一块数据,来存储我们“前面月份”得到的数量。
我们使用 动态规划 的思想,即我们需要求解第 N 个月的兔子数量,依赖于求解第 N-1 个月和第 N-2 个月的兔子数量这两个子问题,我们可以自底向上的求解出每个子问题的解,并保存起来,然后最终求解第 N 个月的兔子数量时直接使用已知的子问题的解即可。
代码如下:
public static int getNums(int n) {int[] nums = new int[n + 1];nums[1] = 1; // 初始状态:nums[0] = 0, nums[1] = 1for (int i = 2; i < nums.length; i++) {nums[i] = nums[i - 1] + nums[i - 2];}return nums[n];}
我们使用了 nums 这个数组保存了每个月兔子数量的值,其实我们也大可不必这么奢侈,在这个问题中我们其实只需要知道前两个月的情况即可,那么我们可以只创建一个长度为 2 的数组分别保存 N-2 个月和 N-1 个月的情况即可。
代码如下:
public static int getNums(int n) {if (n <= 1) return n;// 使用一个长度为 2 的数组存储前两位的值int[] nums = new int[] { 0, 1 };int result = 0;for (int i = 2; i <= n; i++) {result = nums[0] + nums[1];nums[0] = nums[1];nums[1] = result;}return result;}
总结
使用非递归的解法(动态规划),效率上来说也会比递归好很多,不仅仅是因为递归会使得栈的深度变得很大,而且在递归的过程中,求解 getNums(n - 1) + getNums(n - 2) 时,在不同的 n 值下,还会产生很多重复的计算。而非递归的方式仅仅只是获取到之前的值使用,不存在重复的计算消耗。
(兔子繁殖问题)斐波那契数列:递归非递归解法相关推荐
- 兔子繁殖问题 斐波那契数列 java实现
兔子繁殖问题 斐波那契数列 java实现 问题描述 一对兔子,从出生后第3个月起每个月都生一对兔子. 小兔子长到第3个月开始每个月又生一对兔子. 假如兔子都不死, 请问第1个月出生的一对兔子,第n个月 ...
- matlab兔子繁殖问题,斐波那契数列在《疯狂动物城》兔子繁衍中的应用
摘 要: 计算思维的构建有助于帮助学生将实际问题转换为透明易懂的框架算法, 并借助计算机解决.以电影<疯狂动物城>中的兔子繁殖问题为例, 引出斐波那契数列, 引导学生将数学表达式转化 ...
- java递归方法编写兔子繁殖_2018-04-15 斐波那契数列(兔子繁殖数列)
费波那契数列(兔子繁殖数列) 兔子在出生两个月后,就有繁殖能力,一对成年而有繁殖力的兔子每个月能生出一对小兔子来.假设一年以后所有兔子都不死,那么一对小兔子一年以后可以繁殖多少对兔子? 我们来分析一下 ...
- 斐波那契数列的非递归实现
斐波那契数列就是每次最后两个数值相加构成下一个数值,递归定义如下: fibonacci 数列定义: n = 1,2 时,fib(n) = 1 n > 2 时,fib(n) = fib(n-2) ...
- 一只青蛙一次可以跳一级或二级台阶,请问跳n级台阶有多少次跳法之斐波那契数列的非递归写法
对于这个问题 前三次都好算分别为1,2,3次,后面多的话不好简单计算 当第n级台阶时,因为青蛙只能跳一级或二级台阶,所以第n级只有两种方法跳过来, 即,从前一级(n-1)或前两级(n-2),所以调到这 ...
- 斐波那契数列 python 高阶解法
斐波那契数列 python 高阶解法 2022.09.27 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以 ...
- fibonacci斐波那契数列详解 递归求Fn非递归求Fn求n最近的斐波那契数
斐波那契fibonacci 斐波那契额数列即前两项F(0)和F(1)都是1,之后的每一项都是前两项相加和即F(3)=2,F(4)=3,F(5)=5; 通项公式:F(n+2)=F(n+1)+F(n). ...
- 用php递归求fibonacci数列,C++_C语言求Fibonacci斐波那契数列通项问题的解法总结,一:递归实现使用 - phpStudy...
C语言求Fibonacci斐波那契数列通项问题的解法总结 一:递归实现 使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1. 二:数组实现 空间复 ...
- 神奇的兔子序列(斐波那契数列)
14天阅读挑战赛 神奇的兔子序列 假设第1个月有1对刚诞生的兔子,第2个月进入成熟期,第3个月开始生育兔子,而1对成熟的兔子每月会生1对兔子,兔子永不死去.那么,由1对初生兔子开始,12个月后会有多少 ...
- JavaScript初级玩法(3)—兔子问题(斐波那契数列)
问题 有人想知道一年内一对兔子可繁殖成多少对,便筑了一道围墙把一对兔子关在里面.已知一对兔子每一个月可以生一对小兔子,但是一对兔子要从出生后第三个月才开始生小兔子假如一年内没有发生死亡,则一对兔子一年 ...
最新文章
- Docker核心技术之网络管理
- bat文件注册为Windows服务与依赖关系设置
- 为什么cp新的so文件替换老的so,程序会core掉的根本原因是什么?
- BugkuCTF解题报告---WEB
- 全局照明算法基础——从辐射亮度到渲染方程
- java sftp mget_总结三种Shell脚本编程中避免SFTP输入密码的方法
- 你尝试登录的服务器语言不通,七骑士国内服务器正式上线后,各种登录问题解决方案汇总...
- 使用Idea简单搭建springcloud项目
- Spring Security整合JWT,实现单点登录,So Easy~!
- easyui datagrid 列隐藏和显示
- python 字符串中符号的意义
- ubuntu 10.04的git安装和使用
- 天寒宜早睡,梦醒闻雪声,倒计时83
- NOI题库--砝码称重V2(多重背包2^n拆分)
- AxureRP初体验
- 现代通信技术之交换技术基础
- python 网页设计实践报告_网页设计实习报告范文
- Oracle DG主库失败Failover参考
- 聊聊那些我们不应该被百度惯坏的搜索技巧
- 十张图带你看中国交通变迁