通过查找模式从序列生成下一个元素的算法

时间:2016-04-07 03:39:43

标签: python algorithm math

我想知道是否可以列出一些数字,例如。

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

可能是一种可应用于任何数字列表的算法

3 个答案:

答案 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