Страница 1 из 1
Рекурсия
Добавлено: 06 апр 2011, 23:27
silencer
Всем доброго времени суток!
Код: Выделить всё
#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();
}
эта прога просто суммирует элементы в массиве, как здесь использовать рекурсию (т.е. функцию, которая сама себя вызывает)?
Re: Рекурсия
Добавлено: 07 апр 2011, 07:53
Albor
Первое что нужно - это определиться с условием окончания рекурсии. В данном случае можно проверить индекс массива на 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);
//........
Re: Рекурсия
Добавлено: 10 апр 2011, 16:56
silencer
\
Код: Выделить всё
return index==0? *a:*(a+index)+sum(a,index-1);
можно в этом месте поподробнее именно в синтаксисе? *а - это указатель, верно?
это проверка условия, можно его через if описать?
эту часть кода я вообще не понимаю...
Re: Рекурсия
Добавлено: 11 апр 2011, 07:48
Albor
silencer писал(а):\
Код: Выделить всё
return index==0? *a:*(a+index)+sum(a,index-1);
можно в этом месте поподробнее именно в синтаксисе? *а - это указатель, верно?
это проверка условия, можно его через if описать?
эту часть кода я вообще не понимаю...
Чтобы понять эту часть кода нужно почитать про оператор ?. Его можно заменить на 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. Выражение читается читается буквально дословно: вопрос и два ответа на него. Разберитесь с данным оператором и вы оцените его "силу".