- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现 Kadane's Algorithm在序言中。要求之一是尾调用(递归)。
我尝试了很多可能性,但都没有成功。这是我的代码:
max_sum(L, S) :-
S is 0,
H is 0,
max_sum(L, H, S).
max_sum([], S, S).
max_sum([X | L], H, S) :-
( H + X < 0 -> NewH is 0; NewH is H + X),
( S < H + X -> NewS is NewH; NewS is S),
length(L, N),
( N < 1 -> max_sum(L, NewS, NewS); max_sum(L, NewH, NewS)).
NewH, NewS 是临时值(我们不能在 Prolog 中赋值两次,对吗?)。我可以请求提示吗?
编辑:
[trace] ?- max_sum([1, 2, 3], S).
Call: (7) max_sum([1, 2, 3], _G8907) ? creep
Call: (8) _G8907 is 0 ? creep
Exit: (8) 0 is 0 ? creep
Call: (8) _G8991 is 0 ? creep
Exit: (8) 0 is 0 ? creep
Call: (8) max_sum([1, 2, 3], 0, 0) ? creep
Call: (9) 0+1<0 ? creep
Fail: (9) 0+1<0 ? creep
Redo: (8) max_sum([1, 2, 3], 0, 0) ? creep
Call: (9) _G8994 is 0+1 ? creep
Exit: (9) 1 is 0+1 ? creep
Call: (9) 0<0+1 ? creep
Exit: (9) 0<0+1 ? creep
Call: (9) _G8997 is 1 ? creep
Exit: (9) 1 is 1 ? creep
Call: (9) length([2, 3], _G8998) ? creep
Exit: (9) length([2, 3], 2) ? creep
Call: (9) 2<1 ? creep
Fail: (9) 2<1 ? creep
Redo: (8) max_sum([1, 2, 3], 0, 0) ? creep
Call: (9) max_sum([2, 3], 1, 1) ? creep
Call: (10) 1+2<0 ? creep
Fail: (10) 1+2<0 ? creep
Redo: (9) max_sum([2, 3], 1, 1) ? creep
Call: (10) _G9000 is 1+2 ? creep
Exit: (10) 3 is 1+2 ? creep
Call: (10) 1<1+2 ? creep
Exit: (10) 1<1+2 ? creep
Call: (10) _G9003 is 3 ? creep
Exit: (10) 3 is 3 ? creep
Call: (10) length([3], _G9004) ? creep
Exit: (10) length([3], 1) ? creep
Call: (10) 1<1 ? creep
Fail: (10) 1<1 ? creep
Redo: (9) max_sum([2, 3], 1, 1) ? creep
Call: (10) max_sum([3], 3, 3) ? creep
Call: (11) 3+3<0 ? creep
Fail: (11) 3+3<0 ? creep
Redo: (10) max_sum([3], 3, 3) ? creep
Call: (11) _G9006 is 3+3 ? creep
Exit: (11) 6 is 3+3 ? creep
Call: (11) 3<3+3 ? creep
Exit: (11) 3<3+3 ? creep
Call: (11) _G9009 is 6 ? creep
Exit: (11) 6 is 6 ? creep
Call: (11) length([], _G9010) ? creep
Exit: (11) length([], 0) ? creep
Call: (11) 0<1 ? creep
Exit: (11) 0<1 ? creep
Call: (11) max_sum([], 6, 6) ? creep
Exit: (11) max_sum([], 6, 6) ? creep
Exit: (10) max_sum([3], 3, 3) ? creep
Exit: (9) max_sum([2, 3], 1, 1) ? creep
Exit: (8) max_sum([1, 2, 3], 0, 0) ? creep
Exit: (7) max_sum([1, 2, 3], 0) ? creep
在 Call(11) 中,我从这个简单的示例中得到了很好的结果 (6)。我怎么能在这一点上结束功能而不返回呢?这是我的问题。
此代码的结果是 S = 0,而不是 S = 6。
最终编辑(工作代码):
max_sum(L, S) :-
max_sum(L, 0, 0, S).
max_sum([], _, S, S).
max_sum([X | L], H, F, S) :-
NewH is max(0, H + X),
(F < H + X -> NewF is NewH; NewF is F),
max_sum(L, NewH, NewF, S).
地点:
感谢您的帮助:)
最佳答案
这个问题实际上是"Finding the maximum sublist in Prolog "。
有人为其提供赏金,因此不能将其标记为重复。
我建议使用我的 previous solution —它基于 clpfd并使用 SWI-Prolog 运行。
关于prolog - 最大子数组(Kadane 算法)- 尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36310568/
我已经编写了 Kadane 算法,但不知何故它返回了错误的结果。不知道为什么。这是实现。基本上是在数组中找到“和最大的 ubarray” public class Kadane { publi
我将 Kadane 的算法修改为以下内容,这样即使在数组中包含所有负数的情况下它也能正常工作。 //Largest Sum Contiguous Subarray #include #include
尝试使用此处解释的 Kadane 算法:https://www.youtube.com/watch?v=OexQs_cYgAQ&t=721s 在这个数字数组中:[-5, 10, 2, -3, 5, 8
这个算法很有趣,我知道它被用于图像处理(可能还有其他场景),但我觉得奇怪的是这个算法也对负值进行操作,而负值在成像世界中几乎不存在其中有很多 unsigned int 来表示值。 您能否提供一个利用
假设 max_sequence(Array A):是 Kadane 算法的一个解。 你有一个数组:5,-3,-4,8,-1,12,-6,+4,+4,-14,+2,+8 然后将此数组缩短为正负序列的条纹
我正在研究 Kadane 的最大子数组问题算法。现在我从声明中了解到我们已经找到一个 子数组 的算法。子数组是否包含整个数组本身。 其实我在尝试下面的程序 int main(void)
算法说明:最大子数组问题给定一个由 n 个实数组成的序列 A(1) … A(n),确定一个连续的子序列 A(i) … A(j),其中子序列中的元素之和最大。 算法: int kadane(int a[
Initialize: max_so_far = 0 max_ending_here = 0 Loop for each element of the array (a) max
int array[] = {-1, 4, -2, 5, -5, 2, -20, 6}; 如果我有那个数组,我的 Kadane 算法实现可以找到最大子数组: int max_so_far = IN
有人可以告诉我 Kadane 算法中发生了什么吗?想检查我的理解。这就是我的看法。 你正在遍历数组,每次将 ans 变量设置为看到的最大值,直到该值变为负数,然后 ans 变为零。 与此同时,每次循环
这个问题在这里已经有了答案: Maximum sum sublist? (13 个答案) 关闭 8 年前。 我有以下 Kadane's algorithm 的实现求解数组的最大子数组问题: publ
我的算法如下所示: Initialize: max_so_far = 0 max_ending_here = 0 Loop for each element of the array
#include #include int MIN = std::numeric_limits::min() using namespace std ; void findMaxSubArray(
应用 Kadane 算法来获得最大乘积子数组似乎很棘手。虽然我能够获得最大乘积,但我并没有真正获得最大乘积子数组的正确范围。 http://www.geeksforgeeks.org/maximum-
我正在尝试解决 hackerrank 问题 - 最大子数组模 - 此处描述 https://www.hackerrank.com/challenges/maximum-subarray-sum/pro
这是 Kadane 算法的 Java 实现,用于查找具有最大和的连续子数组的和。 static int maxSum(int[] arr) { int maxEndingHer
我查找了寻找连续子数组最大和的最优解。还有一种算法叫做 Kadane 算法。这是我在 geeksforgeeks 上找到的伪代码。 Initialize: max_so_far = 0
我一直在尝试获取子数组的最大积的范围(为求职面试而学习)。 这已经在这里问过(但没有提供有效的答案)。 Getting range of max product subarray using Kada
public class Kadane { double maxSubarray(double[] a) { double max_so_far = 0; double max_e
我感觉Kadane的算法是最大子数组问题真动态规划解法的修改版。为什么我这么感觉?我感觉是因为计算最大子数组的方式可以采取: for(i=0;i using namespace std; int DP
我是一名优秀的程序员,十分优秀!