簡體   English   中英

我可以不遞歸地從堆棧中返回到main嗎?

[英]Can I return to main from recursion without unwinding the stack?

我寫了一個遞歸方法來減少字符串的長度。 如果他的字符串長度小於20,我想在掃描儀輸入中嘗試下一個字符串。 有沒有一種方法比我編碼的方法更有效?

public static void main(String [] args){  
        try { 
            input = new Scanner(new FileInputStream("VectorKnots.txt"));
            output = new PrintWriter(new FileOutputStream("ReduceKnots.txt"));
        }catch (FileNotFoundException e){
            System.out.println("there is a problem with the file");
            System.exit(0);
        }
        while (input.hasNext()){
            loop2 = input.nextLine();
            loop1.delete(0, loop1.length());
            loop1.append(loop2);
            Triangle(loop1);
        }
    }
    public static void Triangle(StringBuilder loop1){
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("27")){
            trIndex = loop1.indexOf("27");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 4);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("72")){
            trIndex = loop1.indexOf("72");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 4);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("63")){
            trIndex = loop1.indexOf("63");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 5);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("63")){
            trIndex = loop1.indexOf("63");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 5);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("46")){
            trIndex = loop1.indexOf("46");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 2);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("64")){
            trIndex = loop1.indexOf("64");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 2);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("57")){
            trIndex = loop1.indexOf("57");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 3);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("75")){
            trIndex = loop1.indexOf("75");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 3);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("52")){
            trIndex = loop1.indexOf("52");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 6);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("25")){
            trIndex = loop1.indexOf("25");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 6);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("34")){
            trIndex = loop1.indexOf("34");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 7);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("43")){
            trIndex = loop1.indexOf("43");
            loop1.delete(trIndex, trIndex+1);
            loop1.insert(trIndex, 7);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("1") && loop1.indexOf("1") + 2) == 0){
            trIndex = loop1.indexOf("1");
            loop1.delete(trIndex);
            loop1.delete(trIndex + 1);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.toString().contains("0") && loop1.indexOf("1") + 2) == 1){
            trIndex = loop1.indexOf("0");
            loop1.delete(trIndex);
            loop1.delete(trIndex + 1);
            Triangle(loop1);
        }
        if (loop1.length() < 20){
            return;
        }
        if (loop1.length() > 19){
            out.println(loop1);
        }

    }
}

如果您使用迭代,則無需從深度嵌套的遞歸中返回。 嘗試:

public static void triangle(StringBuilder loop1) {
    for (;;) {
        if (loop1.length() < 20)
            return; 
        int trIndex = loop1.indexOf("27");
        if ( trIndex >= 0 ) {
            loop1.delete(trIndex+1);
            loop1.setCharAt(trIndex,'2');
            continue;   // start over using loop instead of recursion
        }

        trIndex = loop1.indexOf("72");
        if ( trIndex >= 0 ) {
            loop1.delete(trIndex+1);
            loop1.setCharAt(trIndex,'7');
            continue;   // start over using loop instead of recursion
        }

        // more cases

        break;
    }
}

另請注意

  1. 最后的測試: if ( ... > 19 ) out.println(loop1)不會做任何事情,因為您if ( ... < 20 ) return;if ( ... < 20 ) return; 就在之前 可能希望將打印行移至main ()
  2. contains()只是做indexOf()> = 0,所以您最好單獨做一次,而不要兩個都做。
  3. StringBuilder.insert(loc,int)將int轉換為字符串,然后運行StringBuilder.insert的字符串版本; 因此,為什么不立即將其作為字符串輸入呢?
  4. 您可能會考慮構建某種類型的自動機,也許只對字符串中的每個字符進行一次查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM