小编典典

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

algorithm

我想知道是否有可能采用数字列表。

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

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


阅读 260

收藏
2020-07-28

共1个答案

小编典典

简短的答案是:您要的是不可能的。

您正在寻找的是一种通常与曲线拟合有关的算法。对于此特定问题,一种可能的方法是Lagrange多项式

但是请注意,通常来说,您想要的东西可能没有真正的解决方案。例如,考虑以下简单序列:2, 4, 6, 8, 10, 12, 14。接下来的几个数字是什么?

您可能会说答案是16, 18, 20依此类推,因为您使用方程式f(n) = 2*nwhere 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仅对的那些值产生a
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。这些方法中的某些方法传统上用于机器学习,尤其是线性回归和逻辑回归。

2020-07-28