2010-12-08 26 views
0
int sum(int number, int min, int counter) 
{ 
    int temp=0, n; 
    n=number+temp; 
    if ((number>=(n/2)) & (number!=min)) 
    { 
     number --; 
     temp ++; 
     while (number>=(n/2)) 
     { 
      cout << number << "+"<< temp << "\n"; 
      number --; 
      temp ++; 
      counter ++; 
     } 
    } 
    else if (number==1) 
    { 
     return counter; 
    } 

    sum(n-1, 1,counter); 
} 

int main() 
{ 
    int number,counter=1; 

    cout << "Please enter the number: "; 
    cin >> number ; 
    cout << "\n"; 

    sum(number, 1, counter); 
    cout << counter; 

    return 0; 
} 

是否我需要它但崩潰並有一些問題。只是尋找一些提示如何改善它。用數字理論C++代碼的問題

也想確保我正確地練習遞歸。謝謝!

地址: 該計劃的重點是總計最大可能的方式一個數字可以加起來。

然後總計爲6的序列數是11(包括6本身)。

6 
5+1 
4+1+1 
3+1+1+1 
2+1+1+1+1 
1+1+1+1+1+1 
2+2+1+1 
3+2+1 
4+2 
2+2+2 
3+3 

我也試着不要重複序列,例如2 + 2 + 1 + 1和1 + 1 + 2 + 2。

+0

什麼是這個功能用於?請提供更多細節。 – 2010-12-08 06:59:53

+0

你肯定想要一個合乎邏輯的在這裏:`if((number> =(n/2))&(number!= min))' – ruslik 2010-12-08 07:00:59

+0

@HoàngLong:增加更多信息檢查出來。 – Zud 2010-12-08 07:04:19

回答

4

您沒有退出標準。你的功能只會緩慢進入天空。

2

正如我在這個問題上面評論的那樣,你的求和函數在最後沒有返回值。另一個問題是,您將「計數器」作爲值傳遞,因此它不會在主函數中更改。你應該聲明你的函數是這樣的:

int sum(int number, int min, int &counter) 

的&運營商確定的「反」是一個引用變量,並可以通過「求和」功能來改變。

而作爲ruslik意見,你應該改變操作&爲& &,雖然它並不影響這裏不多。您可以看看示例代碼here

2

此鏈接將幫助您通過從Hoang Long酒店here you go

修改後的代碼,以達到預期的效果有一個錯誤它打印一個額外的組合,但我懶得去解決它。

這裏是code

編輯 修正的bug。

0

下面是一個簡單的實現:

void sum_r(int n, int m, int cnt, int* nums){ 
    for (;n >= m; m++) 
     sum_r(n-m, nums[cnt] = m, cnt+1, nums); 
    if (!n) for (int i=0; i<cnt; i++) printf("%d%c",nums[i],(i==cnt-1)?'\n':'+'); 
}; 

void sum(int n){ 
    int nums[100]; 
    return sum_r(n, 1, 0, nums); 
}; 

int main(){ 
    sum(6); 
    return 0; 
}; 
0

請閱讀計算機編程卷4A的藝術,克努特已經明確列出的許多方法在做,例如,最簡單的方法之一(不遞歸)是這個,

alt text