簡體   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