Рекурсия

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
silencer
Сообщения: 7
Зарегистрирован: 07 мар 2011, 20:58

Всем доброго времени суток!

Код: Выделить всё

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define n 5

void main(void)
{
     clrscr();
     int mas[n],i, sum=0;
     printf("vvedite elemeti massiva:\n");
     for(i=0;i<n;i++)
	{
	scanf("%d",&mas[i]);
	sum+=mas[i];
        }
     printf("summa=%d",sum);
     getch();
}
эта прога просто суммирует элементы в массиве, как здесь использовать рекурсию (т.е. функцию, которая сама себя вызывает)?
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Первое что нужно - это определиться с условием окончания рекурсии. В данном случае можно проверить индекс массива на 0, т.е. если это 1й элемент массива, то сумма на данный момент ещё равна 0 и функция должна просто вернуть значение 1-го элемента, иначе - сумму этого и предыдущего элемента

Код: Выделить всё

int sum(int * a, int index)
{
 return index==0? *a:*(a+index)+sum(a,index-1);
}
int main()
{
 const int n=10;
 int A[n]={1,2,3,4,5,6,7,8,9,11};
 cout<<sum(A,n-1)<<endl;
 return 0;
}

Вызов функции начинаем с последнего элемента, стек вызовов разрастается, пока не будет вызвана ф-ция с index равным 0, далее будет последовательно формироваться сумма.
Либо вариант без индексов

Код: Выделить всё

int sum(const int *const pFirst, const int *pLast)
{
 return pLast==pFirst? *pLast:*pLast+sum(pFirst,pLast-1);
}
//......
// вызов делаем так
sum(A,A+n-1);
//........
silencer
Сообщения: 7
Зарегистрирован: 07 мар 2011, 20:58

\

Код: Выделить всё

return index==0? *a:*(a+index)+sum(a,index-1);
можно в этом месте поподробнее именно в синтаксисе? *а - это указатель, верно?

Код: Выделить всё

index==0?
это проверка условия, можно его через if описать?

Код: Выделить всё

*a:*(a+index)
эту часть кода я вообще не понимаю...
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

silencer писал(а):\

Код: Выделить всё

return index==0? *a:*(a+index)+sum(a,index-1);
можно в этом месте поподробнее именно в синтаксисе? *а - это указатель, верно?

Код: Выделить всё

index==0?
это проверка условия, можно его через if описать?

Код: Выделить всё

*a:*(a+index)
эту часть кода я вообще не понимаю...
Чтобы понять эту часть кода нужно почитать про оператор ?. Его можно заменить на if

Код: Выделить всё

if(index==0) return *a; // *a это разименованный указатель, т. е. значение в ячейке которую адресует указатель a, ещё нагляднее - a[0]
return *(a+index)+sum(a,index-1); // эта строчка сработает, если индекс не равен 0, выражение *(a+index) то же самое, что a[index]
выражение return index==0? *a:*(a+index)+sum(a,index-1); читается как: "вернуть значение по адресу a если index равен нулю, иначе (выражение после двоеточия) сумму значения по адресу смещённому от a на index элементов и результата функции sum c индексом на 1 меньшим, чем переменная index. Выражение читается читается буквально дословно: вопрос и два ответа на него. Разберитесь с данным оператором и вы оцените его "силу".
Ответить