找到序列中的下一个数字

时间:2010-07-13 21:16:16

标签: numbers

这是一个让我感兴趣的编程问题。

您可以为程序提供逗号分隔的数字序列。然后,它从这些数字中找到合适的公式,以找到序列中的下一个数字。

In: 1,2,3,4,5
Out: 6

In: 2,4,6,8
Out: 10

In: 10,8,6,4
Out: 2

我不确定这个问题是否比它看起来复杂得多,在这种情况下它可能不适合代码高尔夫。我只是在暗示它。

6 个答案:

答案 0 :(得分:4)

(从我上面的评论复制):实际上,假设输入的大小是有限的,这总是可以解决的 - 你可以在任何给定的n-1点序列上拟合n度多项式。

平凡的,在MATLAB中(没有安装我,但它应该工作):

x = [1, 2, 3, 4]
y = [2, 4, 6, 8]
poly = polyfit(x, y, 3)
nextnum = polyval(poly, 5)

这将创建一个四点多项式,其中y作为输入序列,拟合三次多项式并在下一个点(5)对其求值。当然,有无数个函数可以生成任何给定的n点,因此猜测“正确”的下一个数字是不可能的。但是,此为您提供一个函数,可以生成您的第一个n输入数字,然后生成下一个数字。也许不是重点,但这可以在这里完成。

答案 1 :(得分:2)

正如其他一些人已经说过的那样:假设有限输入,总会有至少一个拟合这些点的多项式(或者,就此而言,序列),因此以下PowerShell脚本将始终生成有效的下一个数字,至少其中一个序列:

1

它也只有一个字节长,所以我猜它足够高了。

答案 2 :(得分:1)

这不是编程问题。有无数许多合适的公式,找到一个公式并不是一个特别有趣的问题。查找特定类型的公式 可能是一个有趣或有用的问题,具体取决于类型。

例如,给定 n 值,总会有一个合适的公式是{em> n 的polynomial。这对于证明其他数学定理通常很有用,但没有很多实际应用。

此类问题的关键字是interpolation。你给出的三个例子是线性插值;找出线性插值是否可行以及它的结果是一个相对容易的高尔夫问题。

The On-Line Encyclopedia of Integer Sequences是一个收集人们感兴趣的特定序列的网站。

答案 3 :(得分:1)

的Mathematica

f = FindSequenceFunction[{#}, Length[{#}] + 1] &

>f[1,2,3,4,5]
6

>f[2,4,6,8]
10

>f[10, 8, 6, 4]
2

>f[1!, 2!, 3!, 4!, 5!]
720

>f[1, 4, 9, 16, 25]
36

>f[1, 1, 2, 3, 5, 8, 13] // Fibonacci numbers
21

>f[1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7] // Harmonics
1/8

>f[1, 1 + x, 1 + x + x^2, 1 + x + x^2 + x^3, 1 + x + x^2 + x^3 + x^4] // Polynomial sequences
(-1 + x^6)/(-1 + x)

>f[1, -1/2, 1/3, -1/4, 1/5, -1/6, 1/7] // Alternating signs
-1/8

>f[1^1, 2^2, 3^3, 4^4] // n^n sequence
3125

>f[Sin[Pi/4], 2 Sin[Pi/4], 3 Sin[Pi/4], 4 Sin[Pi/4]] // Trig series
5/Sqrt[2]

答案 4 :(得分:1)

J,13个字符

(>:@$p.~p.@<)

说明:

>:@$  NB. One more than the size of the input list...
p.~   NB. ... substituted into the polynomial with coefficients...
p.@<  NB. ... the coefficients of the polynomial with roots specified by the input list

用法:

   (>:@$p.~p.@<)  1 2 3
6

   (>:@$p.~p.@<)  10 8 6 4 
_15

答案 5 :(得分:0)

这个问题表明大脑在模式匹配方面比计算机程序好多少。这种类型的编码并不容易。你必须编写一个(in)有限数量的可能模式和代码来检查输入,希望匹配 - 或多个匹配。这不是高尔夫类型的问题。