繁体   English   中英

递归 function 错误:“堆栈溢出”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM