递归函数错误:"stack overflow"

recursive function error: "stack overflow"

本文关键字:stack overflow 错误 递归函数      更新时间:2023-10-16

我写了这个函数,用来找到能被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);)。