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