簡體   English   中英

為什么在計算Pascal三角形的元素時在遞歸C程序中出現堆棧溢出錯誤?

[英]Why am I getting Stack Overflow error in Recursive C program while computing elements of pascal triangle?

我正在編寫一個C程序來計算Pascular Triangle中的第(i,j)個元素,即f(n,1)= f(n,n)= n,而f(n,k)= f(n-1,k )+ f(n-1,k-1)表示1 <k <n我需要以1000000007為模輸出值。代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

unsigned long int returnModPascal(unsigned long int n,unsigned long int k);

int main()
{
    int t;
    unsigned long int ans,n,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lu %lu",&n,&k);
        ans=returnModPascal(n,k);
        printf("%lu",ans);
    }

    return 0;
}

unsigned long int returnModPascal(unsigned long int n,unsigned long int k)
{
    unsigned long int tempans,tempans1,tempans2;
    if(k==1 || k==n)
        tempans=n;
    else
    {
        tempans1=returnModPascal(n-1,k);
        if (tempans1>=1000000007)
            tempans1=tempans1%1000000007;
        tempans2=returnModPascal(n-1,k-1);
        if (tempans2>=1000000007)
            tempans2=tempans2%1000000007;
        if (tempans1+tempans2>=1000000007)
            tempans=tempans1+tempans2-1000000007;
        else
            tempans=tempans1+tempans2;
    }

    return tempans;
}

當我以n&k的形式輸入123456 3時( 對於較小的整數值(如23 2或12 3的 n&k, 它可以正常工作 )出現錯誤

DummyProject.exe中0x003C3D79的未處理異常:0xC00000FD:堆棧溢出(參數:0x00000001,0x003D2F70)。

任何幫助表示贊賞。

由於您使returnModPascal函數具有遞歸性,因此每個遞歸調用的堆棧上都必須有空間。

例如,如果您讀入123456 ,則對returnModPascal的調用最終將為n = 123456n = 123455n = 123454分配一個堆棧幀。 沒有足夠的存儲空間。

要解決此問題,您將不得不重寫函數,以免最終對較大的輸入進行如此眾多的遞歸調用。

典型的堆棧限制約為1000 KB。 在Linux中,您可以使用

ulimit -a

知道你的(我的大約8 MB)。 由於unsigned long int可以升至(再次假定為gcc)18446744073709551615(64位)或4294967295(32位)[我可能錯了,請參見您的limits.h],並且一個堆棧幀的大小必須為2個字,堆棧溢出迫在眉睫。

編輯:我看到你想要一個替代方案。 您是否考慮過使用組合數學? i C j “計算”第(i,j)個條目。 我的意思是說,實際上並沒有找到階乘並乘法,而是取消了所有可能的項(積分值將始終出現),直到只剩下整數序列(數學意義上)為止。 使用模乘(mod 1000000007)。 閱讀有關使用生成器指數的高效模塊化乘法的信息。

查看以下代碼行:

tempans1=returnModPascal(n-1,k);

您從一開始就調用遞歸函數,這意味着該函數將一直運行到遞歸鏈的最末端,然后才有機會進一步處理輸入。 因此,如果使用相對較大的輸入(例如123456調用此函數,則意味着該函數將必須“堆疊” 12345次,才能最終評估if條件。

您應該嘗試減少輸入,或者更好的選擇是在if語句之后遞歸調用函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM