2017-06-15 4 views
-3

私はリンクリストの特定の名前を追加、削除、インデックスで検索、およびカウントするいくつかの反復メソッドを持っていますが、再帰的なソリューションを使用してそれらを実装したいと思います。反復関数を再帰関数に変換する方法はありますか?

私は本当に始める方法がわかりません。変換を行うために私が従うべきガイドラインはありますか?ここで

は私のコードです:

すべて印刷する方法

public void Delete(string name) 
{ 
    Node last = lastNode; 

    if (last.patient.Name == name) 
    { 
     firstNode = firstNode.Next; 
    } 
    else if (lastNode.patient.Name == name) 
    { 
     Node temp = firstNode; 

     while (temp.Next != lastNode) 
     { 
      temp = temp.Next; 
     } 

     lastNode = temp; 
     temp.Next = null; 
    } 
    else 
    { 
     for (Node current = firstNode; current != null; current = current.Next) 
     { 
      if (current.patient.Name == name) 
      { 
       last.Next = current.Next; 
      } 
      else 
      { 
       last = current; 
      } 
     } 

     size--; 
    } 
} 

を削除するには、getノード方法

public Node GetNode(string name) 
{ 
    for (Node current = firstNode; current != null; current = current.Next) 
    { 
     if (current.patient.Name == name) 
     { 
      return current; 
     } 
    } 

    return null; 
} 

LinkedListの方法で

public int CountName(string name) 
{ 
    int count = 0; 

    for (Node current = firstNode; current != null; current = current.Next) 
    { 
     count++; 
     if (current.patient.Name == name) return count; 
    } 

    return 0; 
} 

を特定の名前をカウントします何私のリンクリスト方式

public List<string> PrintAll() 
{ 
    List<String> temp = new List<string>(); 

    if (firstNode == null) 
    { 
     temp.Add("There are no items in the linked list"); 
     return temp; 
    } 
    else 
    { 
     Node helpNode = firstNode; 

     while (helpNode != null) 
     { 
      temp.Add(helpNode.GetPatient().Name); 
      helpNode = helpNode.getNext(); 
     } 

     return temp; 
    } 
} 
+0

SOはコード作成サービスではないので、 – Arion

+0

あなたの 'CountName'メソッドは、指定された名前のノードの数を返すのではありません。指定された名前を持つ* first *ノードまでのノード。それは意図ですか? –

+0

ようこそStackOverflowへ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [on topic](http://stackoverflow.com/help/on-topic)および[How to Ask](http://stackoverflow.com/help/how-to-ask)をここで適用してください。 StackOverflowは、デザイン、コーディング、リサーチまたはチュートリアルサービスではありません。 インターネット上には、反復と再帰の間の変換を扱うチュートリアルやその他のサイトや、Stack Overflowに関する以前の多くの質問があります。あなたは「新しい」質問を投稿する前にそれらを使う必要があります。 – Prune

答えて

0

の内側に親指の基本的なルールは、関数の引数に(ループを制御しているような)状態のいくつかの種類を維持する反復関数内のすべての変数を変換することです。また、再帰呼び出しを行わずに値を返すだけの特別なケースが必要です。それ以外の場合は、無限ループになります。

例としてCountNameメソッドを選択しましょう。最初に、指定した名前のすべてのノードの数を返すように書き直します(現在、指定された名前で見つかったノードの数を返します)。

オリジナル(反復):

public int CountName(string name) 
{ 
    int count = 0; 

    for (Node current = firstNode; current != null; current = current.Next) 
    {     
     if (current.patient.Name == name) count++; 
    } 

    return count; 
} 

ここで状態変数は、ループ条件であるcurrentノード変数は、あり、そしてそれは、私たちのための特別なケースは、ループ処理を停止する条件がある

再帰呼び出し

の基礎となります。 current == nullの場合、0を返します。

プロパティが一致する場合は、値に1を加えて次のノードを処理します。

patient.nameプロパティが一致しない場合は、次のノードを処理するだけです。これを教えてくれる何

は、我々は(我々のループ状態の開始値である)firstNodeにデフォルト設定よこれだけでなく、私たちの方法にNodeを渡すことができるようにする必要があるということです、そして再帰的にcurrent.Nextに設定します(これはループ条件の最後の部分です)。

public int CountName(string name, Node startFrom = firstNode) 
{ 
    // If this node is null, we just return 0 without any more recursive calls 
    if (startFrom == null) return 0; 

    // If the name matches, we make a recursive call from the next node, 
    // add one to the value, and return it 
    if (startFrom.patient.Name == name) 
    { 
     return CountName(name, startFrom.Next) + 1; 
    } 

    // Otherwise we just make the recursive call from the next node 
    return CountName(name, startFrom.Next); 
} 

希望あなたの方法の残りの部分を完了するためにあなたが十分に得られます。これらの条件を考えると

、ここでの再帰的なソリューションです。

+0

より良い方法があれば、パラメータで次のノードを設定する方が好きですか?ありがとうございます – Ibrahim

+0

私はあなたが何かを繰り返したいと思っているのか分からないのですか?なぜ次のノードに渡したくないのかを説明したり、好きなように機能する再帰的メソッドの例を挙げてください。 –

関連する問題