理解递归,c++
Understanding Recursion, c++
对于下面的代码,谁能告诉我,如果基本情况(n==0)的返回值为0,为什么函数总是返回"0" ?我知道为了纠正这个函数,我只需要将"返回0"替换为"返回1",但是,我试图理解为什么它返回0的基本情况如下。
谢谢你的帮助
int factorial(int n) {
if (n == 0) {
return 0;
} else {
return n * factorial(n-1);
}
}
编辑:希望下面的代码没有逻辑错误…
#include<iostream>
#include<math.h>
using namespace std;
long double factorial (long double n) {
if (n==0) return 1;
if (n<0) return -fabs((n*factorial(n+1)));
return n*(factorial(n-1));
}
int main () {
long double n;
cout << "Enter a number: ";
cin >> n;
cout << "Factorial of " << n << " is " << factorial(n) <<endl;
return 0;
}
如果您看一下阶乘是如何定义的,您会发现如下内容:
f(0) = 1
f(1) = 1
f(n) = f(n-1) * n
所以你的函数确实返回factorial(0)
的错误值。这个函数中的递归基本上是通过在每次新的factorial
函数调用中减少n
来工作的。
假设您调用factorial(3)
。n
表示,当n
不等于零时,else分支将被执行。我们遵循我们定义的第三条规则,调用factorial(2)
(这是n-1)并将其结果乘以n。您的函数将逐步下降,直到factorial(0)
被调用并返回0,然后是所有先前计算的一个因子,得到3*2*1*0
,这等于0
。
这段代码完全是错误的。无论获得哪个n> 0作为参数,每个值最终都会与0相乘,因此对于所有n> 0的值,factorial(n) = 0。
返回0,因为任何数乘以0都是0。从n开始,比如n=5。在递归过程中你会得到:
n * factorial(n-1)
5 * factorial(5-1)
5 * 4 * factorial(4-1)
5 * 4 * 3 * factorial(3-1)
5 * 4 * 3 * 2 * factorial(2-1)
5 * 4 * 3 * 2 * 1 * factorial(1-1)
但是factorial(1-1)是factorial(0),返回0,所以你得到:
5 * 4 * 3 * 2 * 1 * 0 = 0
对于下面的代码,谁能告诉我为什么函数返回"0",如果基本情况(n==0)的返回值是0?
有人选择那样做。你得问问作者为什么这么做。
我知道为了纠正这个函数,我只需要将"返回0"替换为"返回1",但是,我试图理解为什么它在下面的基本情况下返回0。
可能是因为写这篇文章的人认为0!= 0
我不完全明白你的问题,但我们把这个函数命名为f(int n): int好吧,让它更短
对于n = 0,它将返回0,因为这是你告诉它做的正确的:如果(n == 0)返回0;对于n + 1,你会得到以下模式:F (n+1) ==> n * F (n)因为这是你让它做的,对吧?f再次求值
所以这就是为什么你的函数在任何情况下都会返回0,如果你把基础情况改为1,你会得到:
对于任何n
(大于或等于0),您将大量数字乘到factorial(0)
,返回0。
n*(n-1)*(n-2)*...*3*2*1*0
是一个大胖子 0
注:除了不能正常计算外,该代码还有一个主要缺陷。如果你给它一个负数,你会让它哭。
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 包含模板文件的递归会导致编译失败