c++ - 使用变量与使用数字
问题描述
想象一下这些版本中的一个函数:
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
. 结果是一样的,但是在忽略重要性的情况下,您还有其他区别吗?
我知道编译器很有可能会从中生成相同的汇编指令,但是嘿,我只是好奇。
解决方案
正如评论中所指出的,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);
}
推荐阅读
- reed-solomon - Berlekamp-Massey 算法不适用于综合征的最低有效符号为 0
- javascript - 如何在反应中打印包含在状态数组中的元素?
- html - 如何添加边框css
- java - Java,Eclipse,找不到或加载主类
- spring - 如何将 OrmLite DAO 实例自动装配到 Spring 控制器中?
- android - 如何避免房间外键错误 - 约束失败(代码 787)
- node.js - Passport.js 没有删除 req.logout() 上的会话
- spring - Spring Boot 中基于表达式的 Autowire(使用 Kotlin)
- java - 如何将 Java eclipse 插件项目导出到可执行 jar 文件?
- angularjs - 如何在angular js中实现显示更多按钮