2012-01-30 12 views
-4

渡された参照引数は、呼び出し元と呼び出し先の間で共有される項目です。 このアイテムは関数の再帰呼び出し用に共有されていますか?アルゴリズムの終わりに参照渡しによる再帰アルゴリズムのトレース

   2,3,0,1 
     2,3     1,0 
     2  3    1  0 

、コンパイラ:S = {2,3,1,0}、我々が持っているアルゴリズムをトレースすることにより

MergeSort(ref int[]S) 
{ 
    . 
    . 
    . 
    MergeSort(ref S1); 
    MergeSort(ref S2); 
    Merge(S1,S2,S); 
} 

このマージソートアルゴリズムを仮定します(0,1)と(2,3)をマージして(0,1,2,3)を作成する、ツリーの第2レベルでSにマージします。

私たちは1つのS配列を共有しています。どのようにコンパイラがS配列の2つをマージし、それらをマージしましたか? Sは共有されていませんか?予め

+1

すみません!私にとってはアルゴリズムのトレースがより重要です。私はCファミリーのプログラマーが私にアイデアを与えたいと思います。 – PasJ

+3

@PasJ:しかし、3つの異なる言語では、パラメータがやや異なっています。たとえば、Javaでは*参照渡しがありません。問題は、特定の言語を選ぶことなく、理想的にはより完全なコードを与えることなしに無意味です。 –

答えて

1

おかげオブジェクト基準によって渡さしかし、すべての再帰呼び出しで可変S点の異なるオブジェクトに[いう]れます。したがって、merge()はすべて実際には異なるオブジェクト上で実行されます。

+4

あなたはどの言語を話していますか? C#では少なくとも(サンプルが最も似ている)オブジェクトは参照渡しできません:*変数*は参照渡し、*参照*は値渡し可能です。 –

+0

@JonSkeet:私はC#を参照するのではなく、javaとC++を参照しています。私はjavaが参照メカニズムによってパスを持っていないことを知っているが、私はOPが '参照渡し'によって意味すると思う:元のオブジェクトへの参照を渡す[値によって渡された参照] – amit

+1

"参照渡し"と " * *は別個のものであり、両方を記述するために1つの用語を使用すると、単に洞察IMOの代わりに混乱が追加されます。 –