想象一下这些版本中的一个函数:
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. 结果是相同的,但是在忽略重要性的同时,您是否可以意识到其他任何差异?
我知道编译器很有可能会从中生成相同的汇编指令,但是嘿,我只是好奇。
正如评论中指出的那样,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)