请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

__mergeSort递归调用的问题

对递归理解的不是很透彻,

__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);
}

正在回答

1回答

“递归的调用顺序是怎样的,一直向下递归,然后当前函数处于等待状态?等下一层的递归函数结束后再执行上层的函数?”


完全正确!其实递归函数的调用和普通函数的调用没有区别。普通函数的调用中,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[],int l,int r){
    
    cout << "开始归并排序 [" << l << " , " << r  << "] 区间" << endl;
    if(l>=r){
        cout << "达到基线条件,返回" << endl;
        return; //基线条件,结束递归调用
    }

    int mid = l + r;
    
    cout << "准备归并排序 [" << l << " , " << mid  << "] 区间" << endl;
    __mergeSort(arr,l,mid);
    
    cout << "准备归并排序 [" << mid + 1 << " , " << r  << "] 区间" << endl;
    __mergeSort(arr,mid + 1,r);
    
    cout << "准备归并 [" << l << " , " << mid  << "] 和 [" << mid + 1 << " , " << r << "] 区间" << endl;
    __merge(arr,l,mid,r);
}


当然,你可以把更多类似的信息放在__merge函数中。


实际使用这样的方法,去调试跟踪一个小数据量,研究一下,这些输出信息是如何,按照怎样的顺序输出的,进一步理解一下程序的执行顺序。这是非常重要的学习算法的方式哦:)


加油!:)

2 回复 有任何疑惑可以回复我~
  • 加上日志,函数执行过程确实清晰多了
    回复 有任何疑惑可以回复我~ 2021-12-03 15:42:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信