2016-07-25 10 views
-2

いくつかの概念をブラッシュアップしようとしています。私は、リンクされたリスト実装のすべてのノードの中に存在する最小値を見つけようとしています。何らかの理由で私のコードが最後のものだけではなく、すべての再帰的な戻り値を返すと思います。誰かが私のfindMinメソッドで問題と思われるものをチェックできますか?リンクリストの最小値。正しくない再帰的な結果?

public class Node 
{ 
    public int data; 
    public Node next; 
    public Node(int d) 
    { 
     data = d; 
     next = null; 
    } 
} 



public static int findMin(Node head,int min=0) 
{ 
    if (min == 0) 
     min = head.data; 
    if (head.data < min) 
    { 
     min = head.data; 
    } 
    else 
    { 
     findmin(head.next, min); 
    } 
    return min; 
} 
+1

あるべきものです。 –

+0

質問自体には直接関係しませんが、なぜ '0'は' min'にデフォルトで使用されますか?あなたがリスト内の最小の要素を見つけようとしているので、 'int.MaxValue'であると仮定します。 – TerraPass

+2

また、「私のコードは、最後のものだけではなく、すべての再帰的な戻り値を返していると思います。 'findMin()'が与えられた数字のリストに対して何を返すかの例を提供しているのでしょうか? – TerraPass

答えて

1

私はあなたに最初の要素を返すと信じています。または時にはクラッシュします。

if (min == 0) min = head.data; //true initially. min=first element 
if (head.data < min) //false. We just assigned it, it does not get executed 
{ 
    min = head.data; 
} 
else 
{ 
    findmin(head.next, min); //this gets executed but result is ignored 
} 
return min; // return head.data that you assigned in the first line 

これは非常に壊れています。

  1. あなたはhead.data <分はあなたがまだ リストの残りの部分をチェックする必要がある場合であっても 何

  2. にfindmin(head.next、分)の結果を割り当てることを忘れていました。だから、「他には、」あなたは、リストが空の場合

  3. 初期値はint.MaxValueあるべきチェックするのを忘れ

  4. を必要とされていません。上記の として0ではなく、10000ではありません。 ( 何が100000未満であるため)その後、あなたはコンパイラ(またはJIT)をできるように最後に再帰呼び出しを置く方が良いでしょう

  5. を、この余分な比較を必要としない ループと末尾再帰を交換してください。または、自分でループを書くだけです。

ここでは、デバッガを使用してみてください、それは

public static int findMin(Node head,int min=int.MaxValue) 
{ 
    if (head == null) return min; 
    if (head.data < min) min = head.data; 
    return findmin(head.next, min); 
} 
+0

はC#tail-call optimizedですか?いずれにせよ、これは受け入れられた答えでなければなりません:P – Yerken

+0

私はそれを仮定しましたが、私は間違っていました。これによると:http://stackoverflow.com/questions/7102520/does-c-sharp-do-tail-recursion コンパイラはそれをしませんが、JITはこれらの呼び出しを最適化します。 –

+0

これは機能しました。今私の実装には基本的な欠陥があります。ありがとう! –

1

findminの再帰呼び出しの応答は、minに割り当てられません。 0として初期化された値によってmin渡し 1:だからあなたの問題に

+0

この問題を修正するつもりはないが、論理エラーがあり、 'min'より小さい値が見つかると再帰が停止する。 「min」はゼロとして初期化されることは言うまでもない。 – Yerken

0

いくつかの問題を修正する必要がありmin = findmin(head.next, min);のようにそれを呼び出します。

が、これは代わりに

public static int findMin(Node cur) { 
    if (cur == null) return 1000000; 
    int next_min = findMin(cur.next) 
    if (cur.data < next_min) return cur.data; 
    return next_min; 
} 

ベターstackメモリを節約するために、ここで再帰を使用しないようにしてください。 whileループを使って最小値を見つけてください。

関連する問題