如何将双重递归函数变成迭代函数?

问题描述 投票:0回答:1

所以我正在辅导某人计算机算法,他们遇到了我帮助他们解决的问题,但我想出了一个递归算法,但是他们需要处理大量数据并遇到溢出错误,因为它需要进行迭代。问题是合并两个整数列表,以使新合并列表中两个连续项之间的差异之和最小化。

我给了他们一个算法,该算法递归地遍历参数为 lst1、lst2、currsum、previous 的列表。

其中 lst1 是第一个列表(我通过使用

调用函数来递归地遍历列表
Python
foo(lst1[1:], lst2, currsum + abs(lst1[0] - previous), lst1[0])

然后用

再次调用它
Python
foo(lst1, lst2[1:], currsum + abs(lst2[0] - previous), lst2[0])

并返回这两个调用的最小值,在边缘情况(列表为空)我们返回当前和。

正如我所说,我正在尝试将此算法转变为迭代算法,但当我使用不同的索引进行 2 次递归调用时,我不知道如何做到这一点。

基本上,我该如何做才能检查合并列表的所有组合?或者我可以采取某种捷径和贪婪算法吗?

因此,正如我所说,我尝试了递归算法,但是对于大型数据集,它会崩溃,但对于任何足够小的递归数据集都给出了正确的答案。我正在尝试找到一种迭代方法,以便未达到递归深度。

python algorithm recursion
1个回答
0
投票

一般来说,要将递归(单次、双次或非常深的递归)转换为迭代,需要完成一系列工作。

我有点不确定解决您面临的问题需要什么。您有两个整数列表 list_1 和 list_2。您希望有一个“合并”列表 list_merged。

是否需要 len(list_merged) == len(list_1) + len(list_2) ? (例如,list_merged 的元素可以“代表”两个列表中的该元素吗?)

list_merged是否需要包含2个交错的不相交子序列,一个匹配list_1,另一个匹配list_2?

“新合并列表中两个连续项之间的差异之和最小化”是指幅度还是差异?在后一种情况下,问题就很容易解决了。你的代码片段似乎暗示着规模。

你说“我正在尝试找到一种迭代方法,因此未达到递归深度。”。这是非尾递归中的一个基本问题,要检查的堆栈或队列受算法复杂性的限制。为了避免深度过大,可能需要更改算法。

考虑斐波那契数列的递归定义 fibonacci(n) = 1 如果 n 在 {1, 2} 中 斐波那契(n) = 斐波那契(n-1) + 斐波那契(n-2) n >= 3

天真地实现这一点可能会超出堆栈空间或计算时间。 动态规划可以在空间 nlog(n) 和时间 nlog(n) 中解决这个问题。 意识到 fibonacci(n) = Floor(gr ^ n) 也同样有效。

© www.soinside.com 2019 - 2024. All rights reserved.