我想知道是否可以列出一些数字,例如。
lst = [1, 1, 2, 3, 5, 8, 13, 21, 34]
创建一个算法来确定模式是什么:F(n) = F(n-1) + F(n-2)
然后继续并添加下一个数字:
lst.append(x) # x being the next number which is 55
可能是一种可应用于任何数字列表的算法
答案 0 :(得分:5)
简短的回答是:你要求的是不可能的。
您正在寻找的是一般与曲线拟合相关的算法。对于这个特殊问题,一种可能的方法是Lagrange Polynomials。
但请注意,一般来说,您想要的可能没有真正的解决方案。例如,考虑简单的序列:2, 4, 6, 8, 10, 12, 14
。接下来的几个数字是什么?
您可以说答案是16, 18, 20
,依此类推,因为您使用公式f(n) = 2*n
,其中n
是该字词的位置(从1开始)。
请注意,表格中存在无限的等式:
f(n) = [(n-1)*(n-2)*(n-3)*(n-4)*(n-5)*(n-6)*(n-7) * g(n)] + 2*n
第二个术语为n = 1..7
生成正确的值,而第一个术语仅为0
的值生成n
。因此,您可以为第一个术语中的最后一个g(n)
乘数选择任何函数(有限范围),并从n=8
开始获取您想要的任何值。
例如,使用g(n) = 20*n
,
f(n) = (n-1)*(n-2)*(n-3)*(n-4)*(n-5)*(n-6)*(n-7) * 20 * n + 2*n
将产生一个列表:2, 4, 6, 8, 10, 12, 14, 806416
因此,问题在于您声明它无法解决。
但是,如果您表征算法的形式(或表征您希望使用的函数系列,以解决问题),您可以获得最佳拟合数字的函数。例如,您可以说f(n)
是订单1
(线性方程式)的多项式,这会减少可能性的数量,并为您提供f(n) = 2 * n
。其中一些方法传统上用于机器学习,尤其是线性和逻辑回归。
答案 1 :(得分:4)
我会说你想做的事情是不可能的。主要是因为有无数个序列以某些特定元素开头。在这里,您想要找到1, 1, 2, 3, 5, 8, 13, 21, 34
之后的下一个数字,并声明它们是 55,89,144,... 。大多数人都同意你说“这是一个斐波那契序列啊。”
但我会告诉你不,下一个元素可以是 55,91,149 ,序列是ceil(e^(n-1)/2))
。
实际上我可以为你提供无限数量的具有相同起始元素的序列。不相信我?
这个F(n) = F(n-1) + F(n-2) + F(n-9)
怎么样?编写程序,您将看到起始元素是相同的。想要另一个 - 你去F(n) = F(n-1) + F(n-2) - 4 * F(n-9) + F(n - 17)
。
你永远不会说服我或其他任何人你的解决方案是正确的,我的错误。
答案 2 :(得分:0)
虽然在数学中有可能定义这样的序列,假定以下值,这需要聪明的数学家来做一些计算。
当然你可以编写一个功能,其中有一些"硬编码"模式检测,可能不正确。因为这只是一个列表,所以下一个值很可能是12,即使上下文使它看起来像Fibonacci序列。
如果需要生成Fibonacci序列,请考虑生成器函数:
def fib(n):
# generate the first n Fibonacci numbers
i = 0
last = 0
current = 1
while i < n:
yield current
temp = current + last
last = current
current = temp
i += 1