斐波那契数列问题的递归和动态规划3 python实现

题目描述

假设农场中成熟的母牛每年只会生 1 头小母牛,并且永远不会死。第一年农场中有一只成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛 3 年之后成熟又可以生小母牛。给定整数 n,求出 n 年后牛的数量。原题链接
输入描述: 输入一个整数 n。
输出描述: 输出 n 年后牛的数量对 1e9 + 7 取模的值。
示 例: 输入6 输出9

斐波那契数列

斐波那契数列详情可点这里
斐波那契数列百度百科
斐波那契数列又称为‘兔子数列’,一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
在这里插入图片描述
对于斐波那契数列1、1、2、3、5、8、13、……。有如下定义
F(n)=F(n-1)+F(n-2)
F(1)=1
F(2)=1

为什么要对1e9+7取模

取模即取余数

  1. 1e9+7是10位最小质数。
  2. 1e9+7相加不爆int(-2147483648~2147483647:10位),相乘不爆long long(-9223372036854775808~9223372036854775807:十九位),大数mod 1e9+7可以保证数值在永远在int内。大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在8B里面不会溢出。

解题

这是一道变相的斐波那契数列题,三年后小牛长大可生小牛[1, 2, 3, 4, 6, 9, 13, …],存在关系:
F(n)=F(n-1)+F(n-3)
F(1)=1
F(2)=2
F(3)=3

上代码:
解释一下,F(n-1)是之前存在的牛,F(n-3) 是可以生产的牛

def fib(n):
    if n<=3:
        return 1
    else:
        return fib(n-1) + fib(n-3)
def fib3(n):
	#因为在数列前补了两个1,所以取值的时候推后两个取
    return fib(n+2)%(1e9 + 7)

fib3(6)
发布了14 篇原创文章 · 获赞 8 · 访问量 670

猜你喜欢

转载自blog.csdn.net/weixin_44133727/article/details/100009463