1

再帰的な関数を呼び出すプログラムがあります。

int dd=dis(root,2,0);

機能コード

   public int dis(Node n,int g,int count)
   {
    if(g==n.data)
    {
        System.out.println("equal count"+count);
        return count;
    }
    
    else if(g>n.data)
    {
        count=count+1;
        dis(n.right,g,count);
    }
    
    else if(g<n.data)
    {   
        count=count+1;
        dis(n.left,g,count);
    }
    System.out.println("function"+count);
    return count;
}

データがノード値と等しい場合、関数は、必要な正確な値である count を返します。ただし、count を返した後も再帰が続き、関数の最後で異常な count 値を返します。

== ケースから count が返された後、関数を完全に取り消したいのですが、最初の count が返された後に呼び出し元の関数の値を再帰で変更したくありません。

4

1 に答える 1

7

これを変える:

        dis(n.right,g,count);

これに:

        return dis(n.right,g,count);

この:

        dis(n.left,g,count);

これに:

        return dis(n.left,g,count);

追加するために編集:この関数を記述するより簡単な方法は、次のようになります。

public int dis(final Node n, final int g)
{
    if(g == n.data)
        return 0;
    else
        return 1 + dis(g < n.data ? n.left : n.right, g);
}

このアプローチでは、count変数が完全に消えることに注意してください。命令的/手続き的な観点から、このアプローチでは、ツリーに降りるときにノードをカウントするのではなく、戻ってくるときにノードをカウントすると言うかもしれません。(しかし、機能的/再帰的な観点から見てg、適切なサブツリーでの深さが である場合n、親ツリーでの深さは 1 つ大きいと言う方が適切です。)

最も単純な必須バージョンはおそらく次のとおりです。

public int dis(final Node root, final int g)
{
    int depth = 0;
    for(Node n = root; g != n.data; n = (g < n.data ? n.left : n.right))
        ++depth;
    return depth;
}
于 2013-03-27T23:02:58.120 に答える