[英]recursive function error: “stack overflow”
我写了这个 function 应该找到最小的正 integer 可以被每个数字 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()
调用中的文本,以了解 function 的作用。 您正在寻找可被范围内所有数字整除的第一个数字。 如果我的计算是正确的,这个数字应该是该范围内数字的所有唯一素因子的乘积。 对于范围[1,13]
(根据 function 调用,而不是文本),此数字应为:
30030 = 1 * 2 * 3 * 5 * 7 * 9 * 11 * 13
现在,这意味着您将递归调用 function 超过 30,000 次,对于您正在使用的堆栈大小而言,这显然是太多次(默认值相对较小)。 对于这个大小的范围,你真的应该考虑写一个迭代的 function。
编辑:这是一个似乎可行的迭代版本。
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
function 会导致未定义的行为,因为它没有在所有执行路径中返回值。 你可能想说return smallPos(k,n,m);
在最后一部分(或者直接return smallPos(k + 1, n, m);
一次)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.