2011-11-04 79 views
0

擔心我可能會超出我的另一個問題(儘管這是一個新問題)我仍然問這個問題。爲什麼遞歸函數在峯值後向下計數?

我有這樣的代碼:

int blob_count(int y, int x, int gridCopy[][5], int sum){ 

    //Local vars 
    int posX, posY; 

    //Find the position 1 behind and 1 above the starting point, and start the loop there 
    for(posX = -1;posX <=1; posX++){ 
     for(posY = -1; posY <= 1; posY++){ 
      if((y + posY) >= 0 && (x + posX) >= 0){ 
       if((y + posY) <= 5 && (x + posX) <= 5){ 
        if(gridCopy[posY+y][posX+x] == 1){ 
         //Set the starting point to 0 (so it wont get calculated again) 
         gridCopy[posY+y][posX+x] = 0; 



         y = posY+y; 
         x = posX+x; 

         sum++; 
         blob_count(y, x, gridCopy, sum); 
        } 
       } 
      } 
     } 
    } 

    return sum; 
} 

的問題是,總之,這計數1,對於每一個遞歸運行,返回錯誤值。通過這樣做打印每個遞歸來看,它給出結果:

sum = 1 
sum = 2 
sum = ... 
sum = n 

,這是偉大的,但通過設置爲外循環打印出的總和(右前收益之和;)時,它已經達到頂峯發生相反的情況,所以它這樣做:

sum = n 
sum = ... 
sum = 2 
sum = 1 

return sum; // = 1 

這顯然是錯誤的,因爲我想總數,而不是最低。我的返回值是否錯誤?我試過把它放在遞歸調用之後(在循環內部),無濟於事。

+0

'blob_count'每次調用時都會對新的'sum'進行操作。您可能想要傳遞一個指針而不是其值。 – pmg

回答

1

好吧,讓我們擺脫額外的位,並簡化您的問題到要點。 您有:

int blob_count(int sum) 
{ 
    sum++; 

    if (sum < 10) 
     blob_count(sum); 

    return sum; 
} 

如果您在return然後將它在最裏面的遞歸(其中sum == 10),那麼它將return到一個新的水平在哪裏sum == 9,打印先叫前添加printf("sum==%d\n", sum)那,回到sum == 8等等。

如果您在遞歸調用blob_count(sum)之前將其放在您輸入的值之前,那麼您將在打印輸出之前打印這些值,因此它們以sum==0, sum == 1等開頭。


如果你想sum是最深層次的遞歸得,那麼你既可以通過它回到通過返回值是這樣的:

int blob_count(int sum) 
{ 
    sum++; 

    if (sum < 10) 
     sum = blob_count(sum); 

    return sum; 
} 

,或者你可以通過指針傳遞使原始變量得到修改:

void blob_count(int* sum) 
{ 
    *sum++; 

    if (*sum < 10) 
     blob_count(sum); 

    return; 
} 

第一個可能是您正在尋找的解決方案。

+0

史詩般的萌芽!事實證明,我的問題具體是我沒有設置sum = blob_count(sum),這反過來導致我的返回值失配。不勝感激。 – Dennis

+0

我認爲更一般地說,你的問題是,當你不真正理解它時,你試圖使用遞歸。但很高興有所幫助。:) – GrahamS

+0

這可能是真的,但我想我需要學習軟件工程5年的一個原因,並看到我已經在我的大學2個月左右,我真的不希望知道所有的東西,尤其是不是關於遞歸看到我已經有一個2小時的講座了。 – Dennis

1

pmg說什麼。對於每個遞歸調用,總和的當前值被複制,副本被傳遞給遞歸調用。如果你想修改函數中的對象,你必須傳遞一個指向這些對象的指針,而不是對象本身。

+0

指針對我來說還是比較新的,你有什麼機會可以舉個簡單的例子嗎?似乎無法得到它的工作。 – Dennis

+1

@Kola GrahamS在他的回答中有一個例子。正如他所說的,在這裏可能更容易將blob_count的返回值賦值爲sum。但是,如果您需要修改多個參數,則需要通過指針,仔細研究其示例以瞭解如何執行該操作。 –