如何在2次迭代后停止此递归方法

时间:2017-03-01 00:48:18

标签: java recursion

我试图让这个方法只运行两次。我试图将计数器作为参数传递,但它似乎没有工作。

@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(); 
}

3 个答案:

答案 0 :(得分:1)

在处理递归时,您应该考虑的第一件事是如何退出递归循环。一旦你有办法退出循环,你只需要通过某种迭代调用自己。我所做的就是在你的返回时添加一个三元组来检查计数器是否小于或等于0.如果它小于或等于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递归的一些文档。如果您从未打算允许此用户迭代两次以上,请考虑使用接受计数器参数私有,包私有或受保护的方法,具体取决于您的用途。

答案 1 :(得分:0)

你遇到的问题是当你的计数器击中时你不会停止你的程序。此外,你每次都会不断重置计数器的值,所以它不会到达任何地方。

要在两次迭代后使用您尝试使用的计数器停止此递归方法,您必须将计数器作为参数传递,而不是每次都将其设置为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);    
}

这将使你的递归在两次调用后停止,但正如用户Scary Wombat在注释中指出的那样,如果你每次只递归两次,那么迭代这段代码而不是使用递归可能更好。

另外,一般来说,当你使用递归时,请确保你有一个基本情况,否则递归将永远不会结束,直到它耗尽内存。

答案 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); 
}