最常见的子序列(为什么这个递归解不起作用?)

时间:2017-09-13 03:03:32

标签: javascript recursion

尝试编写类似的递归解决方案,如下所述: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")

2 个答案:

答案 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