递归函数错误:"stack overflow"
recursive function error: "stack overflow"
我写了这个函数,用来找到能被1到20的所有数字整除的最小正整数。我得到"堆栈溢出错误",尽管,当我测试数字1到10时,它工作得很好。下面是我的代码:
#include<iostream>
#include<cstdlib>
using namespace std;
// function prototype
int smallPos(int k, int m,int n);
int main(){
printf("the smallest positive number that is divisible by 1 through 20 is %d ", smallPos(1,1,13));
}
int smallPos(int k, int n, int m){
int div=0;
for(int i = n;i<=m;i++) {
if (k%i==0)
div++;
}
if (div==m) {
return k;
} else {
k+=1;
smallPos(k,n,m);
}
}
为什么会发生?反正这个数字不应该那么大。谢谢你!
最终条件(div == m
)永远不会为真。要使div
等于m
,数字k
必须能被[n,m)
范围内所有的数整除。
编辑:我重新阅读了printf()
调用中的文本,以了解该函数的作用。你要找的是第一个能被范围内所有数整除的数。如果我的计算是正确的,这个数字应该是范围内所有数字的唯一质因数的乘积。对于范围[1,13]
(根据函数调用,而不是文本),这个数字应该是:
30030 = 1 * 2 * 3 * 5 * 7 * 9 * 11 * 13
现在,这意味着你将递归地调用函数超过30,000次,对于你正在使用的堆栈大小来说,这显然是太多了(默认值相对较小)。对于这么大的范围,你应该考虑写一个迭代函数。
Edit:这是一个迭代版本,似乎有效。
int smallPos ( int n, int m )
{
int k = 0;
while ( ++k )
{
int count = 0;
for (int i = n; i<=m; i++)
{
if (k%i==0) {
++count;
}
}
if (count == (m-n+1)) {
return k;
}
}
return k;
}
事实上,smallPos(1,10)
的结果是2520。似乎我之前的估计是一个下限,而不是一个固定的结果。
您的smallPos
函数会导致未定义的行为,因为它在所有执行路径中都没有返回值。您可能想在最后一部分说return smallPos(k,n,m);
(或者一次只说return smallPos(k + 1, n, m);
)。
相关文章:
- std::stack 是连续的吗?
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- Incomings Call with Android Sip stack in Embarcadero C++ bui
- 堆叠协程 + gdb = "previous frame inner to this frame (corrupt stack)?"
- 生成质数的程序,错误:"Stack overflow"
- 如何在 x64 上"stack oveflow"例外
- 为什么此代码中显示"*** stack smashing detected ***: <unknown> terminated Aborted (core dumped) "错误?
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- 无法在基于 DFS 的任务排序程序中填充"stack"
- std::stack的奇怪行为,pop()返回相同的值
- 使用双LL在C++中实现Stack失败,出现异常"EXC_BAD_ACCESS(代码=2,地址=0x7fff5
- Ctypes: OSError: exception: stack overflow
- 使用 CFFI 释放内存时"MemoryError: Stack overflow"是什么意思?
- "recursive on all control paths, function will cause runtime stack overflow"超载<<运算符
- C语言中有没有类似'minimizing stack overflow of an array'的东西?
- "Stack overflow"错误。指针可能不在列表中
- std::map 导致内存不足情况下出现"stack overflow"
- "Lane User Stack Overflow"调试 CUDA 程序
- 递归函数错误:"stack overflow"
- 如何避免大矢量初始化"compiler limit: compiler stack overflow"?