c - 尝试了一个来自 ac 教程网站的例子有点弄错了
问题描述
我正在从https://www.tutorialspoint.com/cprogramming/c_recursion.htm学习 C 中的递归, 并尝试了数字阶乘示例。
#include <stdio.h>
int fact(int i) {
if (i <= 1) {
return 1;
}
return fact(i - 1);
}
int main() {
int i = 3;
printf("numb = %d", fact(i));
return 0;
}
执行代码后,它打印出 1。我查看了代码,发现我忘记在函数末尾乘以i
var fact(i - 1)
。我修复了它并得到了正确的阶乘,但为什么fact(3 - 1)
等于 1?
编辑
当我发布这个问题时,我对递归的理解非常肤浅,我以为fact(i-1)
只会执行一次,并没有在教程中得到再次调用该函数的含义,当我阅读busybee的答案时我一开始并不理解我想我现在得到它,fact(3-1)
称为fact(2-1)
var 的值i
现在是 1,它满足 if 条件并返回 1。正确版本中的另一个问题是,当我更改为 为什么返回时,我将 vari
与它相乘,从模式来看将函数的结果与返回的数字相乘为什么?我承认我没有研究 return 的作用,只是顺其自然。fact(i-1)
return 1
return 2
12
return 1
return 2
6
fact
解决方案
要递归计算阶乘,i
必须是正整数。因此,无论i
是 0 还是 1,阶乘都是 1。
如果不是,则调用递归阶乘算法,(i - 1)
然后将结果乘以i
并返回该值,如下所示:
#include <stdio.h>
int fact(int i)
{
if (i ==1)
return 1;
return fact(i - 1) * i; // You forgot to multiply i here
}
int main(void)
{
int i = 3;
printf("Number = %d", fact(i)); // Displaying the factorial of 3
return 0;
}
推荐阅读
- android - 将一些自定义示例数据添加到 TextView
- python - 以所需格式序列化 Django 对象
- python - SQL Alchemy 参数化查询,绑定表名作为参数给出错误
- angular - 如何从当前 url 获取组件名称?
- arrays - Swift - 根据它们的值连接两个元组数组
- javascript - reactjs中如何动态添加、更新和删除表中的行
- javascript - 如何将用户重定向到安全域
- sql-server - SQL 表达式在 Crystal Reports 中返回多行
- python-3.x - cv2.imdecode 错误的颜色(python opencv)
- reactjs - 如何使用