【发布时间】:2021-09-12 08:58:36
【问题描述】:
我正在尝试实现一种方法,该方法将获得一个序列的第一个 k 整数值的数组。根据给定的值,该方法将检测是否可以使用整数系数的线性递归来生成序列的值。
- 如果不可能,将给出错误。
- 如果可能,该方法将返回一个数组
C,其中包含生成序列所需的整数系数,大小为s <= k,其中s尽可能小。
对于斐波那契数列,给定输入 {0,1,1,2,3,5,13},该方法将返回 {1,1}。
对于 Tribonacci 序列,给定至少 3 个值的输入序列,该方法将返回 {1,1,1}
对于已知的递归关系f(n) = f(n - 1) + f(n - 2) - 3 * f(n - 5) + 4 * f(n - 10),任何小于10 值的输入序列都会返回错误,但给定至少10 连续值的序列,该方法将返回{1,1,0,0,-3,0,0,0,0,4},对应于循环系数(数组的第 i' 位置中的零表示不需要 f(n - i) 值)。
显然,事先并不知道重复次数,只是为了简单起见,我给出了已知重复次数的示例。但该方法需要自行检测。
甚至可以做到吗?有什么已知的算法吗?我尝试用 Java 编写一些东西,但实际上它只不过是一种蛮力,检测 ALL 可能的重复,这不是很有帮助......如果它,我很乐意看到有效尝试的代码示例是可能的或任何正确方向的点。
编辑
经过一番搜索,我偶然发现了 “Berlekamp–Massey 算法”,似乎与此主题相关。
【问题讨论】:
-
不可能有一个精确的算法来检测公式(在我看来)。想象一下简单的
f(n)=af(n-1)+bf(n-2), a,b integer。在这种情况下,a,b的变化将如何进行?接下来,当放弃此尝试并在初始函数cf(n-3)中添加更多部分。输入参数的数量非常重要,如果没有限制,算法可能会非常低效。我的观点是,您的问题对数学理论有好处,但作为这里的主题不太实用。(key is algorithm, math related而不是任何语言的任何实现) -
进一步查看给定的答案,您似乎可以检测到线性递归。所以
a,b,etc应该在生成方程组后计算。
标签: java arrays algorithm recursion integer