4.1 斐波那契系列问题的递归和动态规划

题目】:

  给定整数N,返回斐波那契数列的第N项

补充题目1】:

  给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法

  举例:

    N=3,可以三次都跨1个台阶;也可以先跨2个台阶,再跨1个台阶;还可以先跨1个台阶,再跨2个台阶。所以有三种走法,返回3

补充题目2】:

  假设农场中成熟的母牛每年只会生1头小母牛,并且永远不会死。第一年农场有1只成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后成熟又可以生小母牛。给定整数N,求出N年后牛的数量

  举例:

    N=6, 第1年1头成熟母牛记为a;第2年a生了新的小母牛,记为b,总牛数为2;第3年a生了新的小母牛,记为c,总牛数为3;第4年a生了新的小母牛,记为d,总牛数为4。第5年b成熟了,a和b分别生了新的小母牛,总牛数为6;第6年c也成熟了,a、b和c分别生了新的小母牛,总牛数为9,返回9

要求】:

  对以上所有的问题,请实现时间复杂度O(logN)的解法

题目及思路来源:左程云老师《程序员代码面试指南》

原文地址:https://www.cnblogs.com/latup/p/9887216.html

时间: 2024-08-02 01:02:24

4.1 斐波那契系列问题的递归和动态规划的相关文章

【动态规划专题】1:斐波拉契数列问题的递归和动态规划

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 斐波拉契数列问题的递归和动态规划 [题目]:给定整数N,返回斐波拉契数列的第N项.补充问题1:给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法.补充问题2:假设农场中成熟的母牛每年只会生产1头小母牛,并且永远不会死.第一年农场只有1只成熟的母牛,从第2年开始,母牛开始生产小母牛.每只小母牛3年后成熟又可以生产小母牛.给定整数N,求出N年后牛的数量. [举例]斐波拉契数列f(0)=0, f(1)=1,f(

通过“”斐波那契数列“”学习函数递归

斐波那契数列: f(0) = 0  f(1) = 1 f(2) = 1 f(3) = 2  f(4) = 3   f(5) = 8 .......f(n) = f(n - 2) + f(n - 1) 实现方法一: #这个方法使用列表,将结果保存def fbis(num): result = [0,1] for i in range(num - 2): result.append(result[-2] + result[-1]) return result 实现方法二: def fbis_othe

JS 从斐波那契数列浅谈递归

一.前言 昨晚下班后,经理出于兴趣给我们技术组讲了讲算法相关的东西,全程一脸懵逼的听,中途还给我们出了一道比较有趣的爬楼问题,问题如下: 假设一个人从地面开始爬楼梯,规定一步只能爬一坎或者两坎,人只能往上走,例如爬到第一坎,很明显从地面到第一坎只有一种可选方式,从地面爬到第二坎,他可以从地面直接跨到第二坎,也可以先从地面到第一坎,再从第一坎到第二坎,也就是2种可选方式,那么求他爬到N楼一共有几种可选方式. 这道题涉及到了斐波那契数列,要求使用递归来求值,技术贼菜的我也是一脸懵逼,所以本着学习的心

斐波那契列数列的递归与迭代

谈到斐波那契数列 常想到的是递归,由于在电脑中存储数据是开辟栈来存储,若是所要计算的值太大,要面对两个问题,一个是时间问题:对一数的计算,递归和回溯过程中会重复对一个值(例如f(3))进行开辟空间释放空间,因而会十分耗时:另一个问题是空间问题:由于系统分给程序的栈空间是有限的,当数字太大,最终产生的栈空间的情况,即栈溢出,导致我们无法计算. 第二个想到的是通过数组来存储,即将每一个计算后的值都存到数组里,虽然解决了在时间上的问题,但也会出现栈溢出,无法计算大的斐波那契数. 为了解决大数问题同时提

249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据

6.1什么是递归 递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数. 简单理解: 函数内部自己调用自己, 这个函数就是递归函数 注意:递归函数的作用和循环效果一样,由于递归很容易发生"栈溢出"错误(stack overflow),所以必须要加退出条件return. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g

剑指offer 斐波那契系列

目录 T9-斐波那契用迭代 跳台阶 动规 py2 变态跳台阶 wo的初始迭代方法 数学--移位 py2 矩形覆盖 动规 Py2 T9-斐波那契用迭代 跳台阶 动规 py2 # -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here if number<0: return -1 if number <=2: return number a,b=1,2 res = 0 for i in

动态规划(斐波那契系列)---爬楼梯

动态规划 ??递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划保留了子问题的解,避免了重复计算. 爬楼梯 70. Climbing Stairs (Easy) 题目描述: ??有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法. 思路分析: ??定义一个dp数组存储上楼梯的方法数,dp[i]表示走到第i层楼的方法数,第i层楼梯可以从第i-1层和i-2个楼梯再走一步到达.那么走到第i层楼梯的方式为走到第i-1层的方式和第i-2层的方式和. dp[ i

斐波那契数列的非递归

int func(int n){ if (n ==0) return 0; if (n == 1) return 1; int p = 0; int q = 1; for (int i = 1; i < n; i++){ int tmp = p; p = q; q = tmp + p; } return q; } 还有一种方法是使用一个全局数组来保存递归中已经计算过的数 int func(int n){ int memo[n+1]; fib(n); } int fib(int n){ if (n

C语言实现斐波那契数列(非递归)

#include <stdio.h> #include <stdlib.h> void f(int n); int main(void) { f(10); return 0; } void f(int n) { if(n==1) { printf("1\n"); return; } if(n==2) { printf("1 1\n"); return; } printf("1 1 "); int* p=(int*)mall