采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
对递归理解的不是很透彻,
__mergeSort(int arr[],int l,int r){ if(l>=r) return; //基线条件,结束递归调用 int mid = l + r; __mergeSort(arr,l,mid); //这里不太理解,递归的调用顺序是怎样的,一直向下递归,然后当前函数处于等待状态? //等下一层的递归函数结束后再执行上层的函数? __mergeSort(arr,mid,r); ——merge(arr,l,mid,r); }
“递归的调用顺序是怎样的,一直向下递归,然后当前函数处于等待状态?等下一层的递归函数结束后再执行上层的函数?”
完全正确!其实递归函数的调用和普通函数的调用没有区别。普通函数的调用中,A函数里执行B,B执行完以后将继续执行A。递归函数也是一样的。在A函数里执行A,这个A执行完以后,要返回到上层继续执行上层的A。
具体可以参考这里:
https://coding.imooc.com/learn/questiondetail/20335.html
https://coding.imooc.com/learn/questiondetail/43472.html
另外,值得一提的是,可以简单地使用打印的方式,配合小数据集以及单步跟踪,来帮助你更深刻的理解整个函数的执行过程,比如这样:
__mergeSort(
int
arr[],
l,
r){
cout <<
"开始归并排序 ["
<< l <<
" , "
<< r <<
"] 区间"
<< endl;
if
(l>=r){
"达到基线条件,返回"
return
;
//基线条件,结束递归调用
}
mid = l + r;
"准备归并排序 ["
<< mid <<
__mergeSort(arr,l,mid);
<< mid + 1 <<
__mergeSort(arr,mid + 1,r);
"准备归并 ["
"] 和 ["
__merge(arr,l,mid,r);
当然,你可以把更多类似的信息放在__merge函数中。
实际使用这样的方法,去调试跟踪一个小数据量,研究一下,这些输出信息是如何,按照怎样的顺序输出的,进一步理解一下程序的执行顺序。这是非常重要的学习算法的方式哦:)
加油!:)
加上日志,函数执行过程确实清晰多了
登录后可查看更多问答,登录/注册
课程专为:短时间内应对面试、升职测评等艰巨任务打造
9.0k 21
5.8k 3
5.2k 5
1.5k 18
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号