“斐波那契数列”衍生题

一、斐波那契数列

  斐波那契数列是这样的一组数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)即大于2的部分是由前两个相加获得。

  若要求第 N 个数的值,我们可以用递归也可以通过迭代的方式求解

1、递归

def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)

2、迭代

def fibonacci(n):
    dic = dict()
    dic[1] = 1
    dic[2] = 2
    for i in range(2, n+1):
        dic[i] = dic[i-1] + dic[i-2]
    return dic[n]

二、衍生题

 1、跳台阶 / 爬楼梯

  一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

  想象一下,我们从最顶层的台阶开始算起,在最顶层,能够用一次走完的,可能最后只剩一个台阶,也可能只剩两个台阶。然后除去最顶层这一个或者两个台阶,剩下的也是这样,一直循环下去,是不是最后就到了底层?也就是方式不断地往上加,类似斐波那契数列。

  说得可能有点乱,我们通过数学归纳法验证一下:一个台阶,跳一次;两个台阶,可以跳一次,也可以分两阶跳,总共两种;三个台阶,有三种方式;四个台阶,有五种......这样看是不是就是斐波那契数列。那么通过编程地方式,参照上面地代码。

 2、跳台阶II

  一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

  这道题跟上一道题地不同就在于没有了一次跳多少阶的条件。

  F(1) = 1

  F(2) = F(2-1) + F(2-2)

  F(3) = F(3-1) + F(3-2) + F(3-3)

  ...

  其中 F(n-m) 表示 n 阶一次跳 m 阶的次数。

  F(n) = F(n-1) + F(n-2) + F(n-3) + ... + F(n-(n-1)) + F(n-n)   ①

  F(n-1) = F(n-2) + F(n-3) + ... + F(n-(n-1)) + F(n-n)      ②

  ① - ② 得:F(n) = 2 x F(n-1)

  因此代码如下:

def jumpFloorII(number):
        # write code here
        if number == 0 or number == 1:
            return 1
        return jumpFloorII(number - 1) * 2

  当作笔记,写得一般,见笑了。

原文地址:https://www.cnblogs.com/lyuzt/p/11311893.html

时间: 2024-10-09 17:29:48

“斐波那契数列”衍生题的相关文章

斐波那契数列问题的两种解决方法

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于前两项之和. 简单来说,斐波那契数列可以用下面这个公式来表示. { 0 ,n=0 f(n)={ 1 ,n=1 { f(n-1)+f(n-2) ,n>1 关于斐波那契数列衍生的算法题层出不穷,比如青蛙跳台阶问题等(

斐波那契数列以及斐波那契数列的衍生形式 利用矩阵快速幂求解

一.斐波那契数列F[n]=F[n-1]+F[n-2] 可转换为矩阵s[1,1,1,0]的n次幂的矩阵的s[0][1]的值 矩阵的幂次方 可通过 奇判断及进制移位提高时间效率 位与运算 n&1表示的意思:取二进制n的最末位,二进制的最末位为零表示n为哦数,为1表示奇数,即等价于n%2 n>>1 是将n的二进制向右移动一位, n>>=1 即把移动后的值赋给n 题目:求斐波那契数列F[n]%10000(取模) #include <cstdio> #include &l

百度之星题--斐波拉契数列

题目: du熊学斐波那契I Time Limit : 2000/1000ms (C/Other) Memory Limit : 65535/32768K (C/Other) 本次组委会推荐使用C.C++ Problem Description du熊对数学一直都非常感兴趣.最近在学习斐波那契数列的它,向你展示了一个数字串,它称之为"斐波那契"串: 11235813471123581347112358........ 聪明的你当然一眼就看出了这个串是这么构造的:1.先写下两位在0~9范围

Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E. Excellent Engineers-单点更新、区间最值-线段树 G. Growling Gears I. Interesting Integers-类似斐波那契数列-递推思维题

先写这几道题,比赛的时候有事就只签了个到. E. Excellent Engineers 传送门: 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到名单中. 因为是3个变量,所以按其中一个变量进行sort排序,然后,剩下的两个变量,一个当位置pos,一个当值val,通过线段树的单点更新和区间最值操作,就可以把名单确定. 代码: 1 //E-线段树 2 #include<iostream> 3 #include<cstdio> 4 #incl

剑指offer编程题Java实现——面试题9斐波那契数列

题目:写一个函数,输入n,求斐波那契数列的第n项. 1 package Solution; 2 3 /** 4 * 剑指offer面试题9:斐波那契数列 5 * 题目:写一个函数,输入n,求斐波那契数列的第n项. 6 * 0, n=1 7 * 斐波那契数列定义如下:f(n)= 1, n=2 8 * f(n-1)+f(n-2), n>2 9 * @author GL 10 * 11 */ 12 public class No9Fibonacci { 13 14 public static void

算法题---k阶斐波那契数列

#include <iostream> #include <cstdio> #include <stdlib.h> #include <algorithm> using namespace std; int main() { int a[120]; int k, m; while (1) { cout << "输入阶数k和约定的常数max.k和max用空格分开." << endl; cin >> k &

刷题9 斐波那契数列及跳台阶问题

斐波那契数列问题描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.  n<=39 关于斐波那契数列, 定义是这样的: 因为递归太浪费空间, 所以采用循环: 1 class Solution { 2 public: 3 int Fibonacci(int n) { 4 if(n < 2) 5 return n; 6 int first = 0; 7 int second = 1; 8 int sum = -1; 9 for(int i = 0; i < n

07 斐波那契数列 08 跳台阶 两个题的解答相似

官方正规的数学界的斐波那契数列的定义: 波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用. 是以1

水题(water) 【斐波那契数列】

题意: 其中,\(f(1)=1,f(2)=1\). 传送门 分析: 首先先看斐波那契数列的几何意义: 图中各数字为正方形的边长. 可以发现其面积关系刚好满足题目中的等式: \[\sum_{i=1}^{n}{f(i)}=f(n)\times f(n+1) \] 因此 \(f(n)\) 实际上就是斐波那契数列,所以当 \(x\) 是斐波那契数时,求 \(m\) 进制下末尾 \(0\) 的个数.否则,求 \(z\) 皇后数(可以预处理出). 代码: #include <bits/stdc++.h>