powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рекурсия ломает мой мозг
4 сообщений из 4, страница 1 из 1
Рекурсия ломает мой мозг
    #40133340
Dragon88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Я пока-что с трудом понимаю рекурсию. И вот в чем мой вопрос. Допустим, есть учебная задача. Написать функцию для подсчета чисел в одномерном массиве используя при этом рекурсию. ОК. Поехали. Вот код, который подсчитывает сумму чисел.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int sum_mas(int arr[], int size) {
	size--;
	if (size == 0) {
		return arr[0];
	}
	else {	
		return arr[size] + sum_mas(arr, size);
	}
}

int main()
{
	setlocale(LC_ALL, "");
	const int SIZE = 5;
	int arr[SIZE] = { 1,2,3,4,5 };
	cout << sum_mas(arr, SIZE);

}



Все ОК. Сумма чисел подсчитывает правильно. Равно 15. Но если немного код изменить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int sum_mas(int arr[], int size) {
	if (size == 0) {
		return arr[0];
	}
	else {	
                size--;
		return arr[size] + sum_mas(arr, size);
	}
}

int main()
{
	setlocale(LC_ALL, "");
	const int SIZE = 5;
	int arr[SIZE] = { 1,2,3,4,5 };
	cout << sum_mas(arr, SIZE);

}


То здесь уже не правильно подсчитывает сумму чисел. Она равно 16. Вопрос. Почему именно так? Я пока не совсем догоняю эту рекурсию. Строго не судите:) Я новичок:) Прикрепляю файл. Это примерно как я представляю работу рекурсии. Правильность картинки не гарантирую:) Это лишь мои мысли:) Помогите понять мне, нубу, как работает это рекурсия:)
...
Рейтинг: 0 / 0
Рекурсия ломает мой мозг
    #40133345
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну поскольку ты изменил алгоритм то последняя единичка из массива (нулевой элемент) учлась дважды.
...
Рейтинг: 0 / 0
Рекурсия ломает мой мозг
    #40133346
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что
size=1
Код: plaintext
1.
2.
3.
4.
else {	
                size--;
		return arr[0] + sum_mas(arr, 0); //arr[0] + arr[0](=1) со следующей рекурсии
	}


вариант 2
Код: plaintext
1.
2.
3.
int sum_mas(int arr[], int size) {
	if (size == 0) {
		return  0 ;//  а не arr[0]
...
Рейтинг: 0 / 0
Рекурсия ломает мой мозг
    #40133386
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dragon88, Alex Ustinov тебе правильно подсказал про второй вариант.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int sum_mas ( int arr[], int size )
{
  if ( 0 == size )
    return 0;

  --size;
  return arr[ size ] + sum_mas( arr, size );
}

int main( int argc, char* argv[] )
{
  setlocale( LC_ALL, "" );
  int arr[] = { 1,2,3,4,5 };
  cout << sum_mas( arr, sizeof(arr) / sizeof(arr[0]) );
  return 0;
}
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рекурсия ломает мой мозг
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]