java - 为什么这段代码会导致堆栈溢出?为什么只需将 ==1 更改为 <2,然后它就可以工作了?
问题描述
下面是递归斐波那契的代码,它会导致堆栈溢出错误。为什么只是将条件从 n==1 更改为 n<2 就可以了?
考虑正常的斐波那契函数:F(n) = F(n - 1) + F(n - 2)。该函数可以在这里表示为 F(n) = calculate(n, 2)。
这里的概念是 calculate(n, x) = calculate(n - 1, x) + calculate(n - 2, x) + calculate(n - 3, x) + ...+ calculate(n - x, x );
public static int calculate(int n, int x) {
if (n == 1) {
return n;
}
else {
int output = 0;
for (int i = 1; i <= x; i++) {
output += calculate(n - i, x);
}
return output;
}
}
}
解决方案
当您的停止条件为 时,如果您传递给它或负值n == 1
,calculate
则不会停止,这就是您在循环中所做的。0
例如, ifn == 2
和x == 2
,calculate(n - i, x)
变成calculate(0,2)
when i == x
。
因此,if (n <= 1)
或if (n < 2)
是正确的停止条件。
推荐阅读
- python - 在 MQL5 中接受 Python 生成的套接字的输出
- angular - 如何在Angular 6中用间谍对象替换组件范围的服务?
- c - 如何在缓冲区中打印数据,而不考虑到给定长度之间的零
- javascript - Spip - 将数据从 Javascript 传递到隐藏的输入值
- jquery - 数据表函数“fnDeleteRow”无法删除行
- c# - 如何获取父 Datalist 的行 ID
- vba - 字典后期绑定中的VBA Excel字典
- java - 高速按值搜索 KV 数据库
- c# - 设置按钮变量的列跨度
- google-cloud-dataflow - 如何在运行时使用 ValueProviders 为 SpannerIO 分配表和列?