-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番目のコードで見られる主な2つの問題は次のとおりです。

  • 再帰的なバージョンでは、func を呼び出して currentNode でパスを処理してから、currentNode を削除します。反復バージョンでは、visitedNodes を「処理する」スタックに配置し、visitedNodes を処理する前に変更します。
  • 関連する問題: 常に同じ VisitedNodes を何度もスタックしている

したがって、いくつかの解決策は、visitedNodes + 要素 currentNode のコピーをスタックに入れることです。VisitedNodes はこのように変更されません

必要に応じて少しコードを実行できます

于 2012-07-05T18:50:12.587 に答える