碰到问题,不知道如何处理递归函数的返回值
来源:2-9 快速求解数组的逆序对数量
越学越喜欢越学
2022-12-21 18:35:39
int res = 0; res += sort(arr, l, mid, temp); res += sort(arr, mid + 1, r, temp); if(arr[mid] > arr[mid + 1]) res += merge(arr, l, mid, r, temp); return res;
老师您好, 请问如何从递归函数的宏观语意理解 res += sort(), 而不是令res = sort呢? 每次碰到类似的问题,我都不太会处理递归函数的返回值. 怎么才能解决这个问题呢?
1回答
语义的意思是:你到底要怎么做?为什么要这么做?
我们的代码为什么这么写,实际上在具体写代码之前,已经确定了。(对应我在课程中的 ppt 讲解。这个问题其实不应该在代码层面考虑。)
res += sort(arr, l, mid, temp) 的意思是,把 [l, mid] 区间里,任取两个元素,形成逆序对的数量加进 res 里;
res += sort(arr, mid + 1, r, temp) 的意思是,把 [mid + 1, r] 区间里,任取两个元素,形成逆序对的数量加进 res 里;
res += merge(arr, l, mid, r, temp) 的意思是, 把在 [l, mid] 中取一个元素;[mid + 1, r] 中去一个元素,这两个元素形成逆序对的数量加进 res。
这三部分合在一起,形成了 [l, r] 区间中的逆序对数量。
换成 = 完全解释不通。
==========
如果你存在这个问题,说明你暂时思考代码,多于思考问题的解。(而不是把代码本身作为表达问题解的工具。)
在初学时,这也是正常的。我的建议是:
1) 多做一些力扣上和递归,dfs 相关的问题(不过我更建议在学完这个课程的二分搜索树以后再去做这个事情),面对更多的问题,你的体会可能更深刻;
2)如果你觉得应该写成 =,那太正常了。(如果你在设计程序的时候,觉得一个错误的逻辑是正确的,那太正常了。)实际写成 =,然后实际用一个小的测试用例去运行,看结果是否正确?如果不正确,去单步跟踪,看你的程序每一步运行以后,各个变量变成了什么样子?但是如果逻辑正确的话,应该是什么样子?你现在的代码为什么得到了错误的结果?自己哪里想错了?(或者想的是正确的,但实际逻辑没有正确表达自己的想法。)
我强调过很多很多很多次,这个过程是至关重要的,进步就在这个过程中。计算机不是一个完全靠“想”就能学好的专业。计算机是需要不断尝试的。如果你有一个想法,把它实现出来,看看他行不行得通。实际上,这是计算机专业的“优势”(很多专业实际去测试一个想法的成本是非常高昂的。)
你看到的很多人一下子就"想"明白了程序的运行,背后是无数字的实验,调试,慢慢对计算机的如果解决问题,如何运行逻辑,理解的越来越深刻的结果。
继续加油!:)
相似问题