2017-05-26 95 views
2

我在這裏是新的,我有點卡住了。 我創建了一個遞歸算法,使用一個全局變量來記住他進行遞歸調用的位置,我試圖擺脫這個變量,對我來說這似乎不是一個好的解決方案。使用遞歸算法的中綴表示法的前綴

有沒有機會擺脫這個全局變量?我無法調整方法頭,因此方法的接口是固定的。

在這裏你可以看到我的代碼:

static int pos = -1; 
static boolean writeInfix(char[] expr) { 
    boolean result; 
    pos++; 
    int printpos = pos; 
    if(expr[pos]=='+'||expr[pos]=='-'||expr[pos]=='/'||expr[pos]=='*'){ 
     System.out.print("("); 
     writeInfix(expr); 
     System.out.print(expr[printpos]); 
     result = writeInfix(expr); 
     System.out.print(")"); 
     return result; 
    }else if(expr[pos] >= 'a' && expr[pos] <= 'z'){ 
     System.out.print(expr[pos]); 
     return true; 
    }else{ 
     return false; 
    } 
} 

謝謝您的幫助:)

+0

謝謝你的幫助! :) – Skloli

回答

2

您可以添加新的輔助方法,你控制的變量,讓writeInfix(char[])只是一個包裝器,除了調用「真正的」方法外,什麼都不做。

在這種新方法中,pos是一座紀念碑。

  • 這也保證了你可以打電話給你的API方法(writeInfix)兩次(獨立)未經副作用令人擔憂(pos與第一個電話後,錯誤值初始化)。
0

你應該能夠編寫另一種方法與位置附加參數:

private static boolean writeInfix(char[] expr, int pos) { 
    boolean result; 
    int printpos = pos; 
    if(expr[pos]=='+'||expr[pos]=='-'||expr[pos]=='/'||expr[pos]=='*'){ 
     System.out.print("("); 
     writeInfix(expr); 
     System.out.print(expr[printpos]); 
     result = writeInfix(expr, pos + 1); 
     System.out.print(")"); 
     return result; 
    }else if(expr[pos] >= 'a' && expr[pos] <= 'z'){ 
     System.out.print(expr[pos]); 
     return true; 
    }else{ 
     return false; 
    } 
} 

,並在你已經有方法,你只需要調用

static boolean writeInfix(char[] expr) { 
    return writeInfix(expr, -1); 
} 
0

你可以將pos添加爲writeInfix函數的參數。

static boolean writeInfix(char[] expr, int pos); 

無論你是否返回false,返回-1。無論你是否返回true,都返回當前值pos