【问题标题】:Algorithm for detecting recursion检测递归的算法
【发布时间】:2021-09-12 08:58:36
【问题描述】:

我正在尝试实现一种方法,该方法将获得一个序列的第一个 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 值的输入序列都会返回错误,但给定至少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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多