2017-01-20 73 views
0

我非常新的C所以這個問題可能是愚蠢的,但我真的不明白爲什麼一個遞歸功能給了我分段錯誤,而另一個人(只有一個參數改變),沒有給我什麼。 因此,這些函數用於計算「vette」(我的源代碼中的變量的名稱)的數量,該數字大於數組中所有其他連續數字(不包括最後一個數字)的數字。Ç - 分段故障遞歸

這是非工作之一:

#include <stdio.h> 
#include <stdlib.h> 
#define N 6 
int vette(int *a, int len, int lentot) { 
    /* end of the array */ 
    if (lentot<=1) return 0; 
    /* checked if the element is a vetta*/ 
    if (len == 1) { 
    return 1 + vette(&a[1], lentot-1, lentot-1); 
    } 
    /* checking */ 
    if (*a>a[len-1]) 
    return vette(a, lentot-1, lentot); /* this line gives me seg fault */ 
    else 
    return vette(&a[1], lentot-1, lentot-1); 
} 
/*trying the function*/ 
int main() { 
    int a[6]={10,9,4,5,7,6}; 
    printf("%d", vette(a,N,N)); 
} 

正如你所看到的,我使用LEN和lentot作爲指標的影響來導航到函數。但是,由於某些原因,我不明白,函數給我一個錯誤,我寫了「/ *這條線給我seg錯誤* /。

同時,更改lentot-1的變量len-1,在那一刻有相同的值,不會改變lentot的值,因爲它在參數int len,所以什麼也不應該發生,但是我的代碼開始工作完美。 這裏代碼:

#include <stdio.h> 
#include <stdlib.h> 
#define N 6 
int vette(int *a, int len, int lentot) { 
    /* end of the array */ 
    if (lentot<=1) return 0; 
    /* checked if the element is a vetta*/ 
    if (len == 1) { 
    return 1 + vette(&a[1], lentot-1, lentot-1); 
    } 
    /* checking */ 
    if (*a>a[len-1]) 
    return vette(a, len-1, lentot); 
    else 
    return vette(&a[1], lentot-1, lentot-1); 
} 
/*trying the function*/ 
int main() { 
    int a[6]={10,9,4,5,7,6}; 
    printf("%d", vette(a,N,N)); 
} 

我會很感激,以理解爲什麼這個代碼是給我這個錯誤,非常感謝事先!

+0

輸入函數時打印變量的值。這應該馬上告訴你發生了什麼事。 – dbush

+0

@dbush非常感謝這個建議:結果是工作中的正確值,但是在非工作狀態中有一個遞歸函數的循環。 lentot總是5,而len總是6.我沒有理由爲什麼,即使在工作中,len是6,lentot在遞歸函數的一個步驟中是5! –

+0

對不起,我是在問題開始時寫的,但如果有什麼不清楚的地方,告訴我! 「因此,這些函數用來計算」vette「(我的源代碼中的變量名)的數量,這個數字大於數組中所有其他連續數字的數字(不包括最後一個)。」所以,例如,{4,6,1,2}有1個「vette」,即6,因爲比每個連續的數字都要大。我只需要「vette」的數量! –

回答

0

由於堆棧溢出(無雙關語),這會給您一個分段錯誤。你的遞歸永遠不會結束。第二個參數lentot-1不會減少。當您將其更改爲len-1時,它確實如此。

從您的主程序開始,在第一次遞歸調用len = lentot = 6。然後,在被控線路的第二次遞歸調用中,len = 5lentot = 6。問題在於,第三個問題仍然是len = 5lentot = 6,依此類推。

+0

我很抱歉,但我不明白爲什麼。在Len的「地點」賦予函數* lentot -1 *不等於給len?所以,不會* lentot - 1 *成爲函數中的新len?編輯:瞭解;我每次都傳遞相同的變量。非常感謝! –

+0

我補充說明一些。如果遇到像這樣的問題,你應該使用一個調試器或一個'printf'來跟蹤變量的值。 – nickie