2017-03-01 17 views
0

私はこのメソッドを2回だけ実行しようとしています。私はそのようなパラメータとしてカウンタを渡そうとしましたが、動作しているようには見えません。2回の反復の後にこの再帰メソッドを停止する方法

@Override 
public IaaSService createCloudAndReturnWithIt(int counter, IaasService iaas) { 
    int counter = 0; 
    counter+=2; 
    try { 
     iaas = CloudLoader.loadNodes("C:\\Users\\Tom\\git\\dissect-cf-examp‌les\\PM.xml"); 
    } 
    catch (IOException | SAXException | ParserConfigurationException e) { 
     e.printStackTrace(); 
    } 
    return createCloudAndReturnWithIt(); 
} 
+2

希望の値に達するまで、カウンタを渡してインクリメントする - 2回だけすると、realylが再帰パターンに適合しないように見える –

+0

カウンタを渡してもうまくいきません。 –

+0

@SwitchCase試みました – Alexander

答えて

1

再帰を扱うあなたが考えなければならない最初の事はあなたが再帰ループを終了しようとしている方法です。ループを終了させる方法があれば、何らかの反復で自分自身を呼び出すだけで済みます。私が行ったすべての作業は、カウンタが0以下であるかどうかを確認するために3進数を追加します。0より小さいか等しい場合はiaasを返し、そうでない場合はカウンタを減算する同じメソッドへの呼び出しを返します。このバージョンのループでは、n回繰り返され、nはカウンタになります。私はオーバーロードされたバージョンのデフォルトの動作を追加しました下:

public IaaSService createCloudAndReturnWithIt(int counter, IaasService iaas) 
{ 
    try 
    { 
     iaas = CloudLoader.loadNodes("C:\\Users\\Tom\\git\\dissect-cf-examp‌les\\PM.xml"); 
    } 
    catch (IOException | SAXException | ParserConfigurationException e) 
    { 
     e.printStackTrace(); 
    } 
    return (counter <= 0) ? iaas : createCloudAndReturnWithIt(--counter, iaas); 
} 

public IaaSService createCloudAndReturnWithIt(IaasService iaas) 
{ 
    return createCloudAndReturnWithIt(2, iaas); 
} 

Hereは、Javaでの再帰のいくつかのドキュメントです。このようなユーザーに対して2回以上の反復処理を許可するつもりがない場合は、カウンタの引数を受け入れるメソッドをプライベート、パッケージのプライベート、または保護された方法で使用することを検討してください。

0

あなたが持っている問題は、あなたのカウンターはまた2に当たったとき、あなたがあなたのプログラムを停止していないということです、あなたはカウンタの値を毎回reseting保つので、それはどこにも取得していません。

2回の繰り返しの後にこの再帰メソッドを停止させるには、使用しようとしたカウンタを使用して、カウンタをパラメータとして渡し、毎回0に設定せず、チェックする条件を設定する必要があります再帰を止める時間であるかどうか。要するに、それは次のようになります。

public IaaSService createCloudAndReturnWithIt(int counter) { 
    //you would always run this with counter = 0 
    if(counter == 2){ 
     //return whatever IaaSService object you want this method to create 
    } 
    //Your other code to make whatever you need to happen happen. 
    counter++; 
    return createCloudAndReturnWithIt(counter);  
} 

これは、2回のコールの後に再帰停止を行いますが、あなたが二回しかたびに再帰している場合、ユーザー怖いウォンバットとして、コメントで指摘し、それはちょうど良いかもしれません再帰を使用する代わりにこのコードを反復処理します。

また、一般に、再帰を使用しているときは、基本ケースがあることを確認してください。そうでない場合、再帰はメモリ不足になるまで終了しません。

0

メソッドオーバーロードは、問題への最善のアプローチのようです。

// this should be the first method called 
@Override 
public IaaSService createCloudAndReturnWithIt(IaasService iaas) { 
    // the entry to the recursion, start the count at 0 
    return createCloudAndReturnWithIt(0, iaas); 
} 


// for improved efficiency this method should only be called by 
// this method so give it a private visibility 
// @Override <-- what are you overriding? 
private IaaSService createCloudAndReturnWithIt(int counter, IaasService iaas) { 
    try { 
     iaas = CloudLoader.loadNodes("C:\\Users\\Tom\\git\\dissect-cf-examp‌les\\PM.xml"); 
    } 

    catch (IOException | SAXException | ParserConfigurationException e) {  
    e.printStackTrace(); 
    } 

    // the key is to end the recursion with iaas after two iterations 
    return counter == 1 ? iaas : createCloudAndReturnWithIt(++count, iaas); 
} 
関連する問題