尝试编写类似的递归解决方案,如下所述:http://www.geeksforgeeks.org/longest-common-subsequence/但它不起作用。它输出一个。任何人都知道为什么?
LCS_seq_req = (str1, str2) => {
m=str1.length;
n=str2.length;
str1_cut = str1.slice(0, m-1)
str2_cut = str2.slice(0, n-1)
if (m===0 || n===0) {
return 0
}
else if (str1.slice(m-1, m) === str2.slice(n-1, n) ) {
return LCS_seq_req(str1_cut, str2_cut) + 1
} else {
res_1 = LCS_seq_req(str1_cut, str2)
res_2 = LCS_seq_req(str1,str2_cut)
return Math.max(res_1, res_2)
}
}
LCS_seq_req("AGGTAB", "GXTXAYB")
答案 0 :(得分:2)
在JavaScript中,与(比如)Python不同,分配给函数内部的变量不隐式地将其声明为局部变量。相反,您需要使用var
关键字明确声明它;否则你得到一个全局变量。
更具体地说,您的问题是这一行:
res_1 = LCS_seq_req(str1_cut, str2)
具有改变全局变量str2_cut
的副作用,导致此行:
res_2 = LCS_seq_req(str1,str2_cut)
计算错误的值。如果您在正确的位置添加var
,您将得到正确的答案。
顺便说一句,Eric Lippert撰写了一篇博文https://ericlippert.com/2014/03/05/how-to-debug-small-programs/,它为如何自行调试此类问题提供了很好的建议。
答案 1 :(得分:-1)
我查看了您提供的Naive recursive Python implementation of LCS problem并将Python代码转换为JS代码。希望它会有所帮助。
LCS_seq_req = (str1, str2, m, n) => {
if(m == 0 || n == 0)
return 0;
else if(str1.charAt(m-1) === str2.charAt(n-1))
return 1 + LCS_seq_req(str1, str2, m-1, n-1);
else
return Math.max(LCS_seq_req(str1, str2, m, n-1), LCS_seq_req(str1, str2, m-1, n));
}
var X = "AGGTAB";
var Y = "GXTXAYB";
console.log(LCS_seq_req(X , Y, X.length, Y.length)); //6