幼儿园:从斐波那契数列开始
这是通往幼儿园的车,佬请主动下车右转!
目录
引子
深度优先搜索
从记忆化搜索到动态规划
滚动数组优化
尾声
引子
很久很久以前,我们的小斐波那契养了一对小兔子,哦,这两只贪吃的小兔子在某个阳光明媚的早晨,不小心吃了一株基因突变的大白菜而发生了基因突变,于是乎这两只小兔子及其后代获得了以下能力:
1、永生
2、繁殖周期固定,且一次繁殖只能生出一对小兔子,与此同时小兔子出生后的第一周期不具备繁殖能力
也就是说第一周期小兔子没有繁殖能力,所以还是一对;第二周期生下一对小兔于是共有两对小兔;第三周期老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对……
小斐波那契因为没有作业,闲的没事干,于是开始无聊地数兔子,他发现,兔子对数按周期数呈这样一个数列:1、1、2、3、5……聪明的小斐波那契自然也发现了数列的规律:前面相邻两项之和,构成了后一项。小斐波那契十分高兴,他决定将数列用自己的名字命名,于是乎著名的“斐波那契数列”诞生了,它具有以下美妙而简单的性质:
1、
2、
深度优先搜索
一不小心小斐波那契到了上高中的年纪,他的小兔子在家里生了一窝又一窝,每次回到家小斐波那契都很苦恼:因为兔子繁殖的速度超过了他学算数的速度,他已经数不清自己家里有多少对兔子了,但是他还记得小兔子已经繁殖了多少周期,他想请你教教他,算算自己家里究竟有了多少对兔子,这决定着小兔子们的死活——究竟是被吃掉,还是被吃掉。
#include<bits/stdc++.h>
using namespace std;
int dfs(int x){if(x==1) return 1;else if(x==2) return 1;return dfs(x-1)+dfs(x-2);
}
int main(){int n;scanf("%d",&n);printf("%d",dfs(n));return 0;
}
小斐波那契十分高兴,因为算出来的结果显示小斐波那契的家足够容纳更多的小兔子,所以他决定暂时不吃掉这些小兔子,直到有一天——
从记忆化搜索到动态规划
小斐波那契发现输入繁殖周期后,自己的电脑计算小兔子的数量需要很久,经过细细推敲,小斐波那契发现重复的、多余的搜索占用了大量的时间,比如:
小斐波那契不想让这些重复的搜索占用自己和兔兔玩耍的时间,他决定更新你的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int dfs(int x){if(x==1) return 1;else if(x==2) return 1;if(!a[x]) a[x]=dfs(x-1)+dfs(x-2);return a[x];
}
int main(){memset(a,0,sizeof(a));int n;scanf("%d",&n);printf("%d",dfs(n));return 0;
}
这样子小斐波那契就不用花很多时间在电脑前等结果,而是有很多多余的时间和小兔子玩耍了,不过小斐波那契依然觉得自己的代码不够精简,于是又思考了两天,代码3.0出炉了:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N];
int main(){memset(a,0,sizeof(a));a[1]=1;a[2]=1;scanf("%d",&n);for(int i=3;i<=n;i++) a[i]=a[i-1]+a[i-2];printf("%d",a[n]);return 0;
}
滚动数组优化
经过两次优化,小斐波那契对3.0代码十分满意,不过,追求十全十美的小斐波那契仍然觉得代码有一定的优化空间,譬如……空间复杂度?
#include<bits/stdc++.h>
using namespace std;
int n,a[5];
int main(){memset(a,0,sizeof(a));a[1]=1;a[2]=1;scanf("%d",&n);for(int i=3;i<=n;i++){a[3]=a[1]+a[2];a[1]=a[2];a[2]=a[3];}printf("%d",a[3]);return 0;
}
尾声
萧炎和纳兰家的三年之约如期而至又过了三年,小斐波那契从高中毕业啦,小兔子也繁殖了六十个周期,毕竟人到了18岁,就不能过得像个小孩子,小斐波那契决定忍痛杀死自己那养了三年的1548008755920只小兔子,请全世界人民吃烤全兔,那么你觉得平均每个人能分到多少多少只兔子呢?
幼儿园:从斐波那契数列开始相关推荐
- java 斐波拉_Java实现斐波那契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
- 剑指offer:面试题10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...
- 用递归法计算斐波那契数列的第n项
斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...
- 循环斐波那契数列_剑指offer #10 斐波那契数列
(递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...
- 用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?
自己写的,感觉挺有成就感的,就展示出来吧! 判断一个≥2的整型数是否存在于斐波那契数列中? 若存在,则返回第几项:若不在,则返回-1 #include <stdio.h> long gen ...
- 算法(1)斐波那契数列
1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...
- NOIP模拟题 斐波那契数列
题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...
- 剑指offer_第7题_斐波那契数列
题目描述 现在要求输入一个整数n 输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 理解 斐波那契数列 因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...
- 面试官问你斐波那契数列的时候不要高兴得太早
增加内容 递归改进版 矩阵快速幂解法 通项表达式解法 列表法 斐波那契数列应用 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归 ...
最新文章
- dp,sp,px相互转化
- java 同步转并行_Java线程与并行编程(二)
- Mongodb python驱动教程
- 爬取广州所有停车场数据(Python)
- 【STM32】定时器中断实验代码详解
- ERROR 1366 (HY000): Incorrect string value......(Mysql报错解决)
- 基于Linux命令行终端的ftp客户端程序
- python自动化办公excel-自动化办公:python操作Excel
- Chrome上网问题解决记录
- 2013年全国各大著名的IT公司薪资待遇大揭密 给出入职场的民工一点建议
- 3d胆码计算机方法,3D百十个位定胆技巧准确率95
- 别再用QQ的破数字邮箱了,你其实还有注册姓名全拼微软邮箱的机会
- AppCan学习笔记(2)-UI控件
- 新浪企业邮箱服务器怎么设置,新浪企业邮箱如何在Iphone设置邮箱账号
- 基于stm32的四轴无人机和智能车编程实践目录
- GitChat · 安全 | 基于机器学习的 Webshell 发现技术探索
- mysql索引linke和等于_10分钟让你明白MySQL是如何利用索引的
- php判断手机还是电脑
- 3.4 数值分析: 迭代法的收敛性
- 设计模式基础篇-04-建造者模式
热门文章
- Java Apache中的高危漏洞复现
- 腕能助手android9,腕间应用助手
- 【华为OD机试真题 JAVA】字符串分割(二)
- 三菱m64计算机连接参数,三菱M64OPTION参数讲义资料.docx
- S3C2440移植Linux4.19.275内核以及过程中遇到的问题
- html table 标签 边框 边距问题
- 项目文档编写规范与代码规范
- 【Qt Quick】UDP中的端口号随机设置
- DeFi 生态大溃败:“寿司”,糊了;“三文鱼”,焦了
- 数字图像处理知识(2)