尾递归浅析
尾递归 (tail recursion) 是函数式编程中的重要概念。在这篇文章中,我会用类似于 Elm 语言的伪码来解释尾递归。当然,你并不需要懂得任何的Elm来看懂这篇文章。 从递归到尾递归 考虑以下由递归实现的阶乘函数: 我们可以对 factorial(4) 进行展开: 我们在进行了函数调用之后再进行了乘法,所以我们需要一个地方储存数字4、3、2、1。这些数字被存在 栈帧(Stack…
尾递归 (tail recursion) 是函数式编程中的重要概念。在这篇文章中,我会用类似于 Elm 语言的伪码来解释尾递归。当然,你并不需要懂得任何的Elm来看懂这篇文章。 从递归到尾递归 考虑以下由递归实现的阶乘函数: 我们可以对 factorial(4) 进行展开: 我们在进行了函数调用之后再进行了乘法,所以我们需要一个地方储存数字4、3、2、1。这些数字被存在 栈帧(Stack…
CMake is the de facto industry standard for the build system generator of the C and C++ this days. Like C++, people seem to love and hate it at the same time. However, it is definitely a better…
最近,我在工作时遇到了一批旧代码,其中有几个巨大的类。它们是以类似这样的写法写的: 这个示范比实际的类小很多,但我们已经可以从不同的角度来批评它了。比如说这个类的复制操作是违反直觉的浅拷贝。 不过在这里,我想关注“DLL”的部分。这个类是作为我们软件插件的接口而设计的,我们这么用它: 看出问题了吗?我们现在必须用与当年编译动态库插件同样的编译器来编译这段代码(我们当时用的是Visual…
工程的目录结构会有两部分:源文件(在 src 子文件夹中)以及测试(在 test 子文件夹中)。我使用 CMake 来构建这个工程。如果您从没用使用过cmake并且不打算在近期使用它,请直接按 Ctrl/Cmd+W 。 我选择的测试框架是 Catch ,不过选择其他诸如CppUnit、Boost Test Library、googletest…