2012-01-30 101 views
-4

通过引用参数传递的是调用方和被调用方之间的共享项目。 这个项目是否共享一个函数的递归调用?通过引用参数传递跟踪递归算法

假设本次合并排序算法:

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

通过为S = {2,3,1,0},我们有跟踪算法:

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

在算法结束时,编译器将在第二级树中合并为S,合并(0,1)和(2,3)并创建(0,1,2,3)。

我们只有一个S数组是共享的,编译器如何合并2个S数组并合并它们? 所以S不共享??

预先感谢

+1

对不起,算法跟踪对我来说更重要,我希望C系列程序员给我一个想法。 – PasJ 2012-01-30 11:48:19

+3

@PJJ:但三种不同的语言处理参数的方式有所不同。例如,Java根本不*具有*通过引用。如果没有选择特定的语言并理想地给出更完整的代码,这个问题就没有意义。 – 2012-01-30 11:49:45

回答

1

对象通过引用BUT在每个递归调用通过,可变S点[是指]对不同的对象。因此,每个merge()实际上都是在不同的对象上执行的。

+4

你在说什么语言?因为至少在C#中(这个例子看起来最像)对象不能通过引用传递:*变量*可以通过引用传递,或者*引用*可以通过值传递。 – 2012-01-30 11:51:03

+0

@JonSkeet:我不是指C#,而是指Java和C++。我知道java没有通过引用机制传递,但我认为OP的意思是'通过引用':将引用传递给原始对象[通过值传递的引用] – amit 2012-01-30 11:53:19

+1

鉴于“通过引用传递”和“传递引用按价值“*是*不同的东西,用一个词来描述两者仅仅是增加了混淆而不是洞察IMO。 – 2012-01-30 12:05:21