自从我开始编程以来,这一直是我一直很好奇的事情。但对我来说似乎太复杂了甚至尝试。
我很乐意看到解决方案。
1, 2, 3, 4, 5 // returns 6 (n + 1)
10, 20, 30, 40, 50 //returns 60 (n + 10)
10, 17, 31, 59, 115 //returns 227 ((n * 2) - 3)
答案 0 :(得分:19)
您要做的是多项式插值。有许多方法(参见http://en.wikipedia.org/wiki/Polynomial_interpolation),但你必须在多项式的次数和至少U + 1值上有一个上界U.
如果你有连续值,那么有一个简单的算法。
给定序列x1,x2,x3,...,让Delta(x)为差异序列x2-x1,x3-x2,x4-x3,....如果你有一个n次多项式的连续值,那么Delta的第n次迭代就是一个常数序列。
例如,多项式n ^ 3:
1, 8, 27, 64, 125, 216, ...
7, 19, 37, 61, 91, ...
12, 18, 24, 30, ...
6, 6, 6, ...
要获得下一个值,请填写另一个值,然后再向后工作。
6, 6, 6, 6 = 6, ...
12, 18, 24, 30, 36 = 30 + 6, ...
7, 19, 37, 61, 91, 127 = 91 + 36, ...
1, 8, 27, 64, 125, 216, 343 = 216 + 127, ...
对上述值数量的限制可确保您的序列在执行差异时不会变空。
答案 1 :(得分:4)
很抱歉让人失望,但这种情况不太可能(一般情况下),因为任何给定的k
值都有无数的序列。也许有某些限制..
您可以查看此Everything2帖子,该帖子指向Lagrange polynomial。
答案 2 :(得分:4)
正式地,部分序列没有唯一的下一个值。通常理解的问题可以清楚地表述为:
假设展示的部分序列足以约束某些生成规则,推导出最简单的规则并展示下一个生成的值。
问题在于“最简单”的含义,因此对于算法解决方案并不是很好。如果您将问题限制在生成规则的某类函数形式中,则可以执行此操作,但详细信息取决于您愿意接受的形式。
答案 3 :(得分:1)
这本书Numerical Recipes有实际算法的页面和页面来做这种事情。这非常值得一读!
前两种情况很简单:
>>> seq1 = [1, 2, 3, 4, 5]
>>> seq2 = [10, 20, 30, 40, 50]
>>> def next(seq):
... m = (seq[1] - seq[0])/(1-0)
... b = seq[0] - m * 0
... return m*len(seq) + b
>>> next(seq1)
6
>>> next(seq2)
60
第三种情况需要求解非线性函数。
答案 4 :(得分:0)
我喜欢这个想法和序列中的第一和第二,在我看来这是可能的,但是再次你不能概括,因为序列可能完全脱离基础。答案可能是你无法概括,你可以做的是写一个算法来执行一个特定的序列,知道(n + 1)或(2n + 2)等......
您可以做的一件事是在元素i和元素i + 1以及元素i + 2之间取一个区别。
例如,在你的第三个例子中:
10 17 31 59 115
17和10之间的差异是7,31和17之间的差异是14,19和31之间的差异是28,15和59之间的差异是56.
所以你注意到它变成了元素i + 1 = i +(7 * 2 ^ n)。
所以17 = 10 +(7 * 2 ^ 0)
31 = 17 +(7 * 2 ^ 1)
等等......
答案 5 :(得分:0)
您可以尝试使用extrapolation。它将帮助您找到描述给定序列的公式。
对不起,我不能告诉你更多,因为我的数学教育发生在很久以前。但你应该在好书中找到更多的信息。
答案 6 :(得分:0)
这种数字系列通常是“情报测试”的一部分,这使我认为这种算法的术语是通过(至少部分)Turing Test的东西,这是相当困难的完成。
答案 7 :(得分:0)
对于任意函数,它无法完成,但对于像每个示例中的线性函数一样,这很简单。
您有f(n+1) = a*f(n) + b
,问题相当于找到a
和b
。
至少给出序列的三个术语,你可以这样做(你需要三个因为你有三个未知数 - 起点a
和b
)。例如,假设您有f(0)
,f(1)
和f(2)
。
我们可以求解方程式:
f(1) = a*f(0) + b
f(2) = a*f(1) + b
解决方案是:
a = (f(2)-f(1))/(f(1)-f(0))
b = f(1) - f(0)*(f(2)-f(1))/(f(1)-f(0))
(您需要单独解决f(0) = f(1)
以避免被零除的情况。)
获得a
和b
后,您可以重复将公式应用于起始值,以生成序列中的任何字词。
当给出任何序列中的三个点(例如,第4,第7,第23或其他)时,也可以编写更通用的过程。 。 。这只是一个简单的例子。
但是,我们不得不对我们的解决方案的形式做出一些假设。 。 。在这种情况下,将其视为线性,如您的示例所示。例如,可以将它作为更一般的多项式,但在这种情况下,您需要更多的序列项来找到解,这取决于多项式的次数。
答案 8 :(得分:0)
另见Douglas Hofstadter撰写的“流动概念与创造性类比:思想基本机制的计算机模型”一书中的“寻找序列”一章