2010-12-08 2 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++ для теории чисел

Также хотел убедиться, что я правильно рекурсивно тренируюсь. Благодаря!

ADD: Точка программы - это общее количество возможных путей добавления количества.

Тогда количество последовательностей, суммирующих до 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àng Long: добавлено больше информации. – Zud 2010-12-08 07:04:19

ответ

4

У вас нет критерия выхода. Ваша функция просто вернется в небо.

2

Как я уже говорил выше в вопросе, ваша функция суммы не возвращает значение в конце. Другая проблема заключается в том, что вы передаете «счетчик» в качестве значения, поэтому он не будет изменен в вашей основной функции. Вы должны объявить функцию следующим образом:

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

& оператор определяет, что «счетчик» является ссылочным переменным, и может быть изменен с помощью функции «суммы».

А как пишет ruslik, вы должны сменить оператора & на & &, хотя здесь это не сильно влияет.

Вы можете ознакомиться с образцом кода here.

2

Эта ссылка поможет вам here you go

модифицированный код Hoang Long, чтобы достичь желаемого результата есть одна ошибка печатает одну дополнительную комбинацию, но я слишком ленив, чтобы решить эту проблему.

Вот code

EDIT Исправлена ​​ошибка.

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

Смежные вопросы