java - 检测递归的算法

标签 java arrays algorithm recursion integer

我正在尝试实现一种方法,该方法将获得第一个 k 的数组。序列的整数值。根据给定的值,该方法将检测是否可以使用整数系数的线性递归生成序列的值。

  1. 如果不可能,则会给出错误。
  2. 如果可能,该方法将返回一个数组 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 的输入序列values 会返回错误,但给定的序列至少为 10连续值,该方法将返回 {1,1,0,0,-3,0,0,0,0,4} ,对应于递归系数(数组第 i 位置中的零表示不需要 f(n - i) 值)。

显然,事先并不知道重复情况,只是为了简单起见,我给出了已知重复情况的示例。但该方法需要自行检测。

这能做到吗?这有什么已知的算法吗?我尝试用 Java 编写一些东西,但实际上它只不过是一种蛮力,检测 ALL 可能的重复,这不是很有帮助......我很乐意看到有效尝试的代码示例,如果它是可能的或任何正确方向的点。

编辑

经过一些搜索,我偶然发现了“Berlekamp–Massey algorithm”,它似乎与这个主题有关。

最佳答案

给定一个特定的 s,对于第一个 s 之后的序列的每个元素,您会得到一个线性方程(有 s 个未知数)。

例如,如果 s=2 且序列为 1、1、2、3、5、8,则有未知数 a、b 和方程 1a + 1b = 2, 1a + 2b = 32a + 3b = 5 等等。您可以尝试使用任何求解线性方程的方法来求解这些问题——例如高斯消元法。如果 s 很小,那么你的一些方程需要是早期方程的线性组合,但高斯消元法会为你找到那些。在此示例中,2a+3b=51a+1b=21a+2b=3 的线性组合(只需将它们相加上)。

因此您可以尝试 s=1、s=2、s=3 等等,直到找到解决方案。

关于java - 检测递归的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68190727/

相关文章:

ruby - 如何找出 Array1 中的元素在 Array2 中出现的次数

algorithm - 具有精确位置的 pg_routing 的性能

algorithm - O(logn) 总是一棵树吗?

arrays - 字节数组到字符串和向后转换

java - 在 RMI 主机上订阅 EventBus

java - Android Java AppCompatTextView 无法转换为 LinearLayout

java - 404异常中的Spring自定义消息

c++ - 在模板类中初始化 C++ 数组成员

c++ - 初始化 Eigen::Map 的 std::array

java - 单击按钮时不显示 SQLite 数据库