Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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++ - Fatal编程技术网

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
  • 抓起一张卡片,填写四个变量:第一,最后,中间,n
  • 逐行搜索mergesort,直到找到一个新的调用。在当前卡上写下呼叫的行号,将其放入“堆栈”(开始时为空),然后继续执行步骤3
  • 当到达mergesort的末尾时,丢弃当前卡并返回到上一张卡,该卡将位于堆栈的顶部。继续执行步骤4,从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