使用变量与使用数字

aku*_*ykh 2 c c++ assembly

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

int faculty(const unsigned int n) {
    return n == 1 ? n : n * faculty(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
int faculty(const unsigned int n) {
    return n == 1 ? 1 : n * faculty(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是我n在第一个和1第二个中返回,具体取决于n. 结果是相同的,但是在忽略重要性的同时,您是否可以意识到其他任何差异?

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

for*_*818 5

正如评论中指出的那样,gcc 会将两者识别为相同的。对于 clang 对代码做了什么,有一个后续问题。除了叮当声会造成严重破坏外,区别在于外观。


但是,您的代码中存在一个微妙的问题。factorial(0)将进行n-1环绕并递归,直到它到达n==1只是为了返回错误的值:0来自0 * 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);
}
Run Code Online (Sandbox Code Playgroud)

  • @TedLyngmo 确实如此,“0!”被定义为“1”而不是“0” (3认同)
  • 我建议将“n &lt;= 1”作为基本情况,以正确处理“0!”情况,同时为所有更高的输入保存迭代。 (2认同)
  • @user253751你从一开始就明确表示你不喜欢这个答案,我不喜欢它足以继续捍卫它,所以这不会有任何结果。 (2认同)