递归函数错误:“堆栈溢出”

时间:2011-07-12 02:39:27

标签: c++ recursion

我写了这个函数,它应该找到最小的正整数,它可以被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);
    }   
}

为什么会这样?无论如何,这个数字不应该那么大。 谢谢!

2 个答案:

答案 0 :(得分:5)

最终条件(div == m)永远不会成立。要使div等于m,数字k应该可以被{em>所有范围[n,m)中的数字整除。

修改:我重新阅读printf()调用中的文字,了解该功能的作用。您正在寻找第一个可被该范围内的所有数字整除的数字。如果我的计算是正确的,那么这个数字应该是该范围内数字的所有唯一素因子的乘积。对于范围[1,13](根据函数调用,而不是文本),此数字应为:

30030 = 1 * 2 * 3 * 5 * 7 * 9 * 11 * 13

现在,这意味着你将以递归的方式调用函数超过30,000次,这对于你正在使用的堆栈大小来说显然是太多倍了(默认值相对较小)。对于这个大小的范围,你应该考虑编写一个迭代函数。

编辑:这是一个似乎有效的迭代版本。

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.看来我先前的估计是下限,而不是固定的结果。

答案 1 :(得分:1)

您的smallPos函数会导致未定义的行为,因为它没有在所有执行路径中返回值。您可能希望在最后一部分中说return smallPos(k,n,m);(或者一次只是return smallPos(k + 1, n, m);)。