首页 > 解决方案 > 使用变量与使用数字

问题描述

想象一下这些版本中的一个函数:

int faculty(const unsigned int n) {
    return n == 1 ? n : n * faculty(n - 1);
}
int faculty(const unsigned int n) {
    return n == 1 ? 1 : n * faculty(n - 1);
}

唯一的区别是我n在第一个和1第二个中返回,具体取决于n. 结果是一样的,但是在忽略重要性的情况下,您还有其他区别吗?

我知道编译器很有可能会从中生成相同的汇编指令,但是嘿,我只是好奇。

标签: c++cassembly

解决方案


正如评论中所指出的,gcc 将识别这两者是相同的。对于 clang 对代码的作用,有一个后续问题。除了铿锵作响之外,区别在于外观。


但是,您的代码中有一个微妙的问题。factorial(0)将进行n-1环绕和递归,直到它到达n==1只是为了返回错误的值:00 * faculty(-1U)顶级n==0调用中的 a 。(0!定义为1)。

这是一个过于冗长的正确版本:

int faculty(const unsigned int n) {
    const unsigned int stop_when_n_leq = 1;
    const int return_at_stop = 1;
    return n <= stop_when_n_leq ? return_at_stop : n * faculty(n - 1);
}

推荐阅读