首页 > 其他分享 >泰波纳契数列

泰波纳契数列

时间:2024-03-20 21:56:52浏览次数:21  
标签:return 数列 int t3 波纳契 dp fn

实现泰波纳契数列的时候,用寻常的写法效率很低,

class Solution:
    def tribonacci(self, n: int) -> int:
        dp = [0 for i in range(n+1)]
        if len(dp) == 1:
            return 0
        elif len(dp) == 2 or len(dp) == 3:
            return 1
        else:
            dp[0] = 0
            dp[1] = 1
            dp[2] = 1
            for i in range(3, n+1):
                dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
            return dp[n]

有另一种更高效的写法:

class Solution:
    def tribonacci(self, n: int) -> int:
        fn = lambda n, t3: t3[n] if n < 3 else fn(n - 1, t3[1:] + (sum(t3),))
        return fn(n, (0, 1, 1))

首先,使用了一个匿名函数lambda(), 原来可以直接用fn传参, 当n<3的时候直接调用t3, 当n>3的时候,想将后面的归纳到0-2, 因此传入的参数需要改变,n不变, 三元元组变为f1, f2还有f0+f1+f2因此使用t3[1:] + (sum(t3), ), 加一个逗号是为了表示这是一个元组, 将t3[1:]进行拼接, 因为t3本来就是元组, 所以可以直接这么拼接。
为什么是f(n-1)呢?
是为了让n逐渐减小直到n<3, 但是这个不是fib(3)而是经过t次计算之后的值,这个就相当于设定了一个循环变量,每次减1,都相当于往前计算一个值。相当于距离那个窗口的距离,每次-1都离窗口边缘更近一步

标签:return,数列,int,t3,波纳契,dp,fn
From: https://www.cnblogs.com/zhumeili/p/18086178

相关文章

  • 波动数列
    一、题目描述P8614[蓝桥杯2014省A]波动数列二、问题简析设第一个数为\(x_0\),\(d_i=a~or~-b\),则长度为\(n\)的数列的和为:\[\begin{split}s&=x_0+x_1+x_2+...+x_{n-1}\\&=(x_0+0)+(x_0+d_1)+(x_0+d_1+d_2)+...+(x_0+d_1+...+d_{n-1})\\&=n*x_0+0+(n-1)*d_1+(n-......
  • 详细解释可变参数列表C语言
    目录考研复习-函数栈帧(详解)一.什么是可变参数列表?1.1 求两个数据中的最大值1.2求多个数据中的最大值1.3逐步分析 1.va_start 2.va_arg3.va_end 4._INTSIZEOF(t)第一步理解:4的倍数第二步理解:最小4字节对齐数                第三步理解:理解源代......
  • (斐波那契数列),假如兔子都不死,问到第12个月时一共有多少只兔子 //(有一对兔子,从出生后第
    //斐波那契数列,计算兔子的数量:11235813......从第三个数开始,//后一个数都是前两个数的和,假如兔子都不死,问到第12个月时一共有多少只兔子//(有一对兔子,从出生后第三个月开始,每一个月生一对兔子,小兔子同理)publicclassRabitDemo1{//斐波那契数列,计算兔子的数量:1......
  • 有趣的数列
    一个比较正常,自然的思路:看这篇题解像这种全排列的问题,一个很正常的想法就是从小到大进行依次放置,再看一下每次放置的限制是什么我自己想的时候,是直接先把所有奇数位的数字取出来,那么显然取了\(n\)个数,剩下的\(n\)个数肯定是偶数位的,而且由题意,他们只存在唯一的一种摆法(即从小到......
  • 数学分析复习:数列和级数收敛
    数学分析复习:数列和级数收敛1.实数列收敛的定义2.实数项级数收敛的定义3.单调有界实数列必收敛4.Bolzano-Weierstrass定理5.Cauchy列5.1Cauchy列的性质5.2实数列的Cauchy收敛准则5.3实数项级数的Cauchy收敛准则6.Euler常数e的构造7.判断实数列和实数项级数收......
  • abc234E 不小于X的数位构成等差数列的最小数字
    给定X,求不小于X的整数,满足各个数位正好构成等差数列。1<=X<=1E17直接枚举首项和公差,找出所有可行的解,取最优值即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for(inti=a;i<=b;i++)#defineper(i,a,b)for(inti=b;i>=a;......
  • 线段树维护区间等差数列
    线段树维护区间等差数列我们采用用两个懒标记分别维护等差数列首项k和公差d维护时有个细节是假如我有左右两个区间需要合并信息时我们对于左边还是k和d但是对于右边信息此时k应该变成k+len*d,公差还是dlen表示的是右边区间长度牛牛的等差数列#include......
  • [蓝桥杯 2019 省 B] 等差数列
    实际上这道题不需要先排序再求gcd,因为无论是哪两项之前作差,都不会影响最后的gcd的结果。因为公差是从a2-a1开始算的,因此i=1时要特殊处理,不能把a1-0计入贡献,否则会算出错误的gcd。即作差时不要加上a1-0,统计最值时不要漏掉a1#include<iostream>#include<stdio.h>#include<a......
  • 无聊的数列[题解]
    无聊的数列[link1][link2]题目大意给定一个数列\(A\)有两种操作:将数列中\(A_i\)(\(L\leqi\leqR\))加上一个等差数列(首项D公差K)查询数列中第P位数区间加上一个等差数列可以用差分来解决例原序列:000000差分序列:000000等差序列:13579(首项1......
  • 洛谷题单指南-二分查找与二分答案-P1182 数列分段 Section II
    原题链接:https://www.luogu.com.cn/problem/P1182题意解读:每段和的最大值越小,则分段数就越多,因此可以通过给定每段和的最大值,将分段数划分为两类:<=M,>M,对每段和的最大值进行二分即可。解题思路:二分的判定条件为,给定每段和的最大值,计算分段数,计算逻辑如下:依次遍历每一个数,求当前......