2017-02-01 98 views
0

我有一個方法,使用out進行求和和輸出。我的方法是這樣的:在C中使用遞歸函數#

public void MyMethod(int page, string city, out int citySum) 
{ 
    citySum = 0; 

    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     MyMethod(page + 1, city,out citySum); 
    } 
} 

什麼混淆我的是我想出來citySum佔總。但是通過這種配置,citySum在每個遞歸步驟都變爲零。我如何保存citySum的值並將它傳遞給下一個遞歸步驟?

+3

爲什麼'的for(int i = 0; I <50; i ++在){citySum ++;}'和不'citySum + = 50;'? –

+9

停止使用出參數並返回該整數而不是void從您的方法。 –

+0

@DawidRutkowski我需要使用出參數,這是一個要求。 – jason

回答

7

通過簡單地引入新的變量來保存結果暫時

public void MyMethod(int page, string city, out int citySum) 
{ 
    citySum = 0; 

    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     int tempSum = 0; 
     MyMethod(page + 1, city, out tempSum); 
     citySum += tempSum; 
    } 
} 

或者使用ref代替

public static void MyMethod(int page, string city, ref int citySum) 
{ 
    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     MyMethod(page + 1, city, ref citySum); 
    } 
} 

Working example on Fiddle


或者直接返回結果:

public static int MyMethod(int page, string city) 
{ 
    int citySum = 0; 

    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     citySum += MyMethod(page + 1, city); 
    } 

    return citySum; 
} 

Working example on Fiddle

+0

不知道我是怎麼錯過了你在我寫回答時直接返回結果的版本!不應該將自己與OP的代碼捆綁在一起。此版本3也是最好的答案。 – TheLethalCoder

+0

一個問題:當我在下一個遞歸步驟中調用它時,CitySum是不是零? – jason

+0

謝謝你的回答 – jason

4

不要使用並將其從方法返回int類型。還使用+= 50使代碼更清晰。

public int MyMethod(int page, string city, int citySum = 0) 
{ 
    //for (int i = 0; i < 50; i++) 
    //{ 
    // citySum++; 
    //} 

    citySum += 50; 

    if (page < 15) 
    { 
     return MyMethod(page + 1, city, citySum); 
    } 

    return citySum; 
} 

注意的是,這裏citySum被默認設置爲0但可以通過調用方法進行設置。要解決此你可以使用一個public方法暴露這一個通過改變它是private

public int MyMethod(int page, string city) 
{ 
    return MyMethod(page, city, 0); 
} 

private int MyMethod(int page, string city, int citySum) 
{ 
    //...