【LeetCode】原来递归真的很屌,尾递归真的很快

来源:互联网 发布:长大的好处 知乎 编辑:程序博客网 时间:2024/05/16 07:03


俗话说“熟能生巧”,前几个题目做的很苦B,就是遍历树的时候不用递归,结果写起来超级复杂,并且还性能不好。这下学乖了,一开始就用递归思维来做,简单而快捷。


这次题目是“找到二叉树的最大/最小路径的值”,就是从树根到树叶路径最大值,或者最小值。在这里:https://leetcode.com/problems/maximum-depth-of-binary-tree/


写的时候没考虑非递归,直接用尾递归的“感觉”去写,写好了也没用本地编译,直接提交就Accepted了,看来逻辑简单了,出错概率也低。


<span style="white-space:pre"></span>void GetMaxPath(TreeNode *root, int n, int& max){if (root){if (root->left == NULL && root->right == NULL){max = max > n ? max : n;return;}GetMaxPath(root->left, n + 1, max);GetMaxPath(root->right, n + 1, max);}}<span style="white-space:pre"></span>int maxDepth(TreeNode *root) {if (root == NULL){return 0;}int max = 0;GetMaxPath(root, 1, max);return max;}


于是看了一下性能图:


已经快到C语言组里面去了,后面C++组写的估计是普通递归居多,编译器没帮你优化。这样又使我产生疑问:同样这段代码,在C语言组里面会多快呢?因为这段代码是基本通用的,就是把引用变成指针,结构体前面加上struct关键字即可。


效果是这样:



从12ms“强烈提升”到5ms,代码还是那个代码。突然想起教科书上面写:“C++编译器比C多生成部分代码,性能损失5%”,不过似乎是没算上编译器优化的部分,可见对于尾递归C编译器比C++更好,可能是很多系统级别都用C编译器,这块是重点优化的部分吧。


可以看到追求极致性能,还是直接用C语言吧,完成相同功能,比C++快了一个数量级,这也印证了我们之前的推断。一切快和慢都是相对的,不是靠想当然和xx领导说的,完全是靠实验数据得出来的,做LeetCode最明显的,就是学习了科学思维,这才是真正的“计算机工程”,我们上的4年大学白上了, 花大钱培训也一点科学没学到,工作几年基本上都是白痴领导拍脑袋决策,加上看谁顺眼不顺眼来确定程序优劣。回想起当年有个老程序员曾经有意让我们“先写测试用例,后写程序”,可惜白痴领导没上心,我也没有多生工程经验,就没坚持这种正确路线。真是可惜可惜,错过了好的路线,估计今后也没机会了。


这次幸好CoolShell的陈浩同志提醒了我,他闭关4个月专门刷LeetCode,于是让我也产生了兴趣,前辈们的经验,给我很多帮助,在下一并感谢了。


0 0
原创粉丝点击