2017-01-02 80 views
1
public boolean q0() { 

    if(word[0] != 'a') { 
     System.err.println("Word not accepted!"); 
     System.exit(0); 
    } 

    if(word.length-1 > cont && word[cont] == 'a') { 
     cont++; 
     return q0(); 
    } 
    else if(word[cont] == 'b') { 
     q1(); 
    } 

    return false; 
} 

我的代碼工作正常。但我必須確定這是否實際上是一個遞歸這是否被認爲是遞歸?

+0

是啊,你爲什麼認爲它不是? – Mritunjay

+0

是的,任何調用自己的函數都被稱爲遞歸函數。無論它是否僅被稱爲單個案例... –

+0

遞歸本身調用e方法。在你的情況下,你正在'q0'的定義中調用'q0'方法。所以你正在使用遞歸 –

回答

2

這是技術上的遞歸,是的,因爲q0()自稱。

雖然這是有缺陷的。它使用一個外部變量cont,它在調用之間發生變化。將cont作爲在不同調用之間傳遞的參數而不是可變的外部狀態將會好得多。

此:

cont++; 
return q0(); 

會變成這樣:

return q0(cont + 1); 

而且,這個分支是不尋常的:

else if(word[cont] == 'b'){ 
    q1(); 
} 

如果是這樣return q1();?我的猜測是你的意圖是轉發q1的回報價值。還是q1()實際上有副作用?如果是後者,那是一種巨大的代碼味道。