最长的子序列递归版本

时间:2017-11-04 00:51:07

标签: recursion

传统的最长增长子序列问题。 这是递归版本(不是DP版本) 我意识到版本1代码有一个错误,所以我将其更改为版本2.

我不清楚为什么version2有效,而version1有输入A0的错误

请参阅下面的版本1和版本2:

static int lis1(int[] v) {
    int maxLen = 1;

    for(int i = 1; i < v.length; i++) {
        List<Integer> w = new ArrayList<Integer>();     

        for( int j = 0; j < i; j++) {
            if( v[j] < v[i] ) {
                w.add(v[j]);                
            }
        }

        // it used to be the following one line which has bug for input A0
        //cand =  lis1(l2a(w)) + 1;           // version1

        // so I changed it to the following, but can't clearly understand why it works.
        // without this part, it has but for input A0
        int cand = 1;                         // version2
        if(v[i-1] < v[i])
            cand =  lis1(l2a(w)) + 1;
        else 
            cand =  lis1(l2a(w));

        maxLen = Math.max(maxLen, cand);        
    }

    return maxLen;      
}

public static void main(String[] args) {
    int[] A0 = {3, 2, 5, 6};    // for this input version1 had a bug which printed out 4 ( instead of 3 )
    int[] A1 = {1, 2, 3, 3, 2, 4, 6, 7};                            // 6
    int[] A2 = { 10, 22, 9, 33, 21, 50, 41, 60, 80 };               // 6
    int[] A3 = { 5, 0, 4, 2, 3, 7, 1 };                             // 4
    int[] A4 = { 2, 7, 3, 4, 9, 8, 12 };                            // 5
    int[] A5 = {3, 4, 2, 5 };                                       // 3

1 个答案:

答案 0 :(得分:1)

实际上......你的版本都没有。尝试放A0={3,2,7,6},你的v2返回2,显然是错误的。

对于v1,对于v={3,2},答案应为1,对吧?让我们看看你的代码做了什么。当索引为i=1时,w内部for循环后的{}等于w={}。然后你对maxlen进行了递归调用,它应该返回0,但它返回1.为什么,因为你的1变量,用{3,2,5,6}错误地初始化了。此错误传播到整个if并给出错误的答案。

v2意外地解决了这个问题,因为(3<2)条件失败maxlen,它返回先前返回的1。

只需删除整个版本2,更正for(int i = 1; i < v.length; i++)初始化。并使用i=0启动外部循环static int lis1(int[] v) { int maxLen = 0; for(int i = 0; i < v.length; i++) { List<Integer> w = new ArrayList<Integer>(); for( int j = 0; j < i; j++) { if( v[j] < v[i] ) { w.add(v[j]); } } cand = lis1(l2a(w)) + 1; // version1 maxLen = Math.max(maxLen, cand); } return maxLen; } ,否则单元素数组将获得0。

QMAKE_CC = /path/to/the/c/compiler
QMAKE_CXX = /path/to/the/c++/compiler