c+中的递归+;在合并排序的示例中 我对C++中的递归有一个非常普遍的问题。为了更好地理解,我使用下面的合并排序示例来解释我的错误 void mergesort (int* first, int* last) { int n = last - first; if (n<=1)return; int* middle = first + n/2; mergesort (first, middle); mergesort (middle, last); merge (first,middle, last); }
输出:c+中的递归+;在合并排序的示例中 我对C++中的递归有一个非常普遍的问题。为了更好地理解,我使用下面的合并排序示例来解释我的错误 void mergesort (int* first, int* last) { int n = last - first; if (n<=1)return; int* middle = first + n/2; mergesort (first, middle); mergesort (middle, last); merge (first,middle, last); },c++,C++,输出: ThinkStation-S20:~/c++/test_files$ ./mergesort n= 4first = 6middle = 1 n= 2first = 6middle = 2 merge part, n= 2 merge part, middle= 2 merge part, last= 1 merge part, left = first 6 merge part, right = middle 2 n= 2first = 1middle = 3 merge part,
ThinkStation-S20:~/c++/test_files$ ./mergesort
n= 4first = 6middle = 1
n= 2first = 6middle = 2
merge part, n= 2
merge part, middle= 2
merge part, last= 1
merge part, left = first 6
merge part, right = middle 2
n= 2first = 1middle = 3
merge part, n= 2
merge part, middle= 3
merge part, last= 4197792
merge part, left = first 1
merge part, right = middle 3
merge part, n= 4
merge part, middle= 1
merge part, last= 4197792
merge part, left = first 2
merge part, right = middle 1
1236
与C一样,C++也按顺序一个接一个地执行语句。因此,对mergesort的第二次调用将在第一次调用返回后发生。有了适当的
合并定义
,就可以了。我强烈建议你自己试试这个程序,用纸和铅笔模拟电脑。这不会花你太长时间(老实说!),它应该会解决你的疑问
与快速排序一样,mergesort可以(部分)并行执行。对mergesort的两个递归调用彼此独立,因此执行可能重叠。但是C++没有为你做这件事,而不需要额外的额外工作。
这里有一种使用铅笔和纸的方法,我认为这比解释printf输出更容易理解
main
调用mergesort不会同时发生任何事情,将每个后续函数调用视为添加到堆栈中会有所帮助。在函数结束时,它会弹出堆栈并继续
尝试在代码的每一行之前添加
printf
或cout
语句,以了解事物的执行顺序。虽然一开始可能会让人困惑,但您为理解所看到的内容所做的努力将真正帮助您理解递归。谢谢您的回答。我试着用铅笔和纸来模拟它。一些问题:只要中间指针指向第二个元素,调用mergesort(first,middle)
就不会返回任何内容(void)。然后调用mergesort(中间,最后)
。使用的是哪一种中间方法?@math:每次输入mergesort
时,都会创建一个新的上下文(“堆栈帧”),其中包含自己的参数和局部变量。因此,当你在纸上做这个练习时,每个mergesort都有自己的first、middle、last和n。而且,每个mergesort返回到调用它的mergesort。是的,我同意。例如,我的数组是{6,4,1,3}first
指向6,last
指向3。然后n=4,我的第一个middle
,称为middle1
指向1。然后递归应用于mergesort(首先,middle1)
,n=2,我的新中间指针middle2
指向4。在下一个递归中,我们得到一个返回。现在发生了什么?控件返回调用mergesort(middle,last)的调用方,使用其middle和last。感谢您的耐心等待。我已经添加了完整的源代码和输出。在以第一部分结束后,它不调用mergesort(中间、最后)。下一个输出来自merge
。我不明白为什么第一个最后一个也指向1。
ThinkStation-S20:~/c++/test_files$ ./mergesort
n= 4first = 6middle = 1
n= 2first = 6middle = 2
merge part, n= 2
merge part, middle= 2
merge part, last= 1
merge part, left = first 6
merge part, right = middle 2
n= 2first = 1middle = 3
merge part, n= 2
merge part, middle= 3
merge part, last= 4197792
merge part, left = first 1
merge part, right = middle 3
merge part, n= 4
merge part, middle= 1
merge part, last= 4197792
merge part, left = first 2
merge part, right = middle 1
1236