递归方法在每一步返回一个字符串?

时间:2012-05-21 09:03:49

标签: java algorithm recursion tree

我有一个轻微的算法问题。我想我错过了什么但却无法弄清楚是什么。

我想走到一个包含字符串的树上,然后拿出一个独特的字符串。

以下是我要解析的树的图形示例。

tree example

我的树有三种不同类型的元素:

  • 布尔运算符(OR,NOT,AND)=> BE
  • 其他运营商(例如=)=> QO
  • leaves(last elements)=> LEAF

我想结束这样的事情:

"LEAF QO LEAF BE LEAF QO LEAF "

现在,我使用递归方法:检查树的当前元素,然后根据我拥有的元素类型对其子元素重新运行该方法。对于每个步骤,我将填充我的最后一个字符串。

public class SingleTest {     static String [] booleanElements = {“或”,“和”,“not”};

public static void main(String[] args) throws Exception {
    CommonTree tree = (CommonTree)parser.parse().getTree();

    if(true){
        String where = "";
        printWhere(tree, where);
        System.out.println(where);
    }       

}   

/*
 * Print to where tests
 */
public static boolean isBooleanElement(CommonTree t){
    return Arrays.asList(booleanElements).contains(t.toString().toLowerCase());
}


public static String printWhere(CommonTree t, String where){
    //---------------------
    // Checking node type
    //---------------------

    // Boolean Element 
    if (isBooleanElement(t)){
        // Continue parsing the tree                
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            printWhere((CommonTree)t.getChild(i), where+ "BE");
        }               
    }

    // Last element of tree (LEAF)
    else if(t.getChildCount() == 0 ){
        where = where + "LEAF";
    }

    // query operator
    else{
        // Continue parsing the tree    
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            printWhere((CommonTree)t.getChild(i), where + "QO");
        }                   
    }

    //---------------------
    return where;
}

我的问题是这段代码:

        String where = "";
        System.out.println(printWhere(tree, where));

返回“”(由于我的实现,这是合乎逻辑的)。

所以我的问题是,如何才能将非空字符串作为最终输出?

希望这很清楚 谢谢你的帮助

请注意,此类仅用于测试目的,我知道将静态放在任何地方都是不好的做法:)

编辑:

问题是(正如预期的那样),因为我缺乏递归经验。 这是我的最终代码:

public static String printWhere(CommonTree t, String where){
    //---------------------
    // Checking node type
    //---------------------

    // Boolean Element 
    if (isBooleanElement(t)){
        // Continue parsing the tree                
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            where = printWhere((CommonTree)t.getChild(i), where) + "BE";
        }               
    }

    // Last element of tree (LEAF)
    else if(t.getChildCount() == 0 ){
        where = where + "LEAF";
    }

    // query operator
    else{
        // Continue parsing the tree    
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            where = printWhere((CommonTree)t.getChild(i), where ) + "QO";
        }                   
    }

    //---------------------
    return where;
}

1 个答案:

答案 0 :(得分:3)

问题是你的方法printWhere没有返回任何东西!您将值附加到新的where字符串,但由于Java按值传递参数,因此当您离开方法时,这个新创建的字符串将被丢弃。

使此方法返回字符串并在其末尾返回where。然后,将递归调用的结果与上一级别的字符串连接起来。这就是递归的工作原理。