-2

我想转换下面给出的递归函数:

 LinkedList i=a; //a contains the nodes which are adjacent to the last element of g
 for(String i1: i )
{
  if(g.contains(i1) || i1.equals("o"))
   { continue; }
  g.addLast(i1);
  func(g);
  g.removeLast();
}

我想将上述程序转换为迭代程序。有人可以帮忙吗

4

2 回答 2

0
LinkedList i=a; //a contains the nodes which are adjacent to the last element of g
   for(String i1: i )
   {
      if(g.contains(i1) || i1.equals("o"))
       { continue; }
      g.addLast(i1);
      func(g);
      g.removeLast();
   }

因此,通过它看起来好像步骤如下:
1)检查当前字符串是否存在或者它是否等于“o”
2a)如果是,则继续
2b)否则将当前字符串放在列表的末尾。
3) 重复步骤 1->2
4) 删除列表的最后一个元素

如果考虑到这些步骤,我要使代码尽可能简单,它看起来像这样:

func(LinkedList ll)  
{  

    Set set = new HashSet(ll);  //removes all duplicates  
    if(set.contains("o")  {  set.remove("o") ;}  //these are strings so that works
    LinkedList newLL = new LinkedList(set);  //order still retained  
    newLL.poll();  //remove last element
}  
于 2012-07-05T18:46:45.757 回答
0

如果我正确理解您的代码,它会找到所有可用的路径,对吗?

我在您的第二个代码中看到的主要 2 个问题是:

  • 在递归版本中,您通过调用 func 处理带有 currentNode 的路径,然后删除 currentNode。在迭代版本中,您将visitedNodes 放入“待处理”堆栈中,然后在处理之前更改visitedNodes !
  • 相关问题:你总是在同一个visitedNodes上堆叠

所以一些解决方案是在堆栈中放入visitedNodes + 元素currentNode 的副本。visitedNodes 不会以这种方式改变

如果需要,我可以做一些代码

于 2012-07-05T18:50:12.587 回答