Рекурсивная функция для вычисления выражения - исправить код - C (СИ)
Формулировка задачи:
Условия задачи:
Пусть x1=x2=x3=1; xi=xi-1+xi-3, i=4,5...
Никак не получается сделать рекурсию, сделал только решение этой задачи через цикл для дальнейщей проверки рекурсии:
В наработках по рекурсии только часть кода, которая вычисляет значение xi:
Выполнить эту задачу нужно в одной функции.
И ещё: преподаватель говорит, что рекурсия должна вызываться только один раз, а как это сделать я не знаю. Ведь в том и смысл рекурсии, что она вызывает сама себя несколько раз, или я что-то не понял
double funkcia(int n)
{
int i;
double *x;
float tmp, sum=0;
x=(double *)calloc(n, sizeof(double));
x[0]=x[1]=x[2]=1;
for(i=3; i<n; i++)
{
x[i]=x[i-1]+x[i-3];
}
for (i=0; i<n; i++)
{
tmp = x[i] / pow(2.0, i+1);
sum += tmp;
}
return sum;
}int xn_rec(int n)
{
static int x[99] = {1,1,1};
static int next_i = 3;
int i = n - 1;
if(i >= next_i)
{
x[i] = xn_rec(n - 1) + xn_rec(n - 3);
next_i = n;
}
return x[i];
}Решение задачи: «Рекурсивная функция для вычисления выражения - исправить код»
textual
Листинг программы
#define N 20
void xn_rec(int* pn, int i);
int main()
{
int A[N];
xn_rec(A, 0);
for (int i = 0; i < N; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
void xn_rec(int* pn, int i)
{
if (i >= N) return;
pn[i] = (i > 2) ? pn[i-1] + pn[i-3] : 1;
xn_rec(pn, ++i);
}
Объяснение кода листинга программы
- Объявлена функция
xn_rec, которая принимает два аргумента:pnиi. Первый аргумент - это указатель на массив, второй - индекс текущего элемента массива. - В функции
mainобъявлен массивAтипаintс размеромN. - Вызывается функция
xn_recс аргументамиAи0, где0- это индекс первого элемента массива. - В функции
xn_recпроисходит проверка: еслиiбольше или равноN, то функция возвращает управление. - Если условие в предыдущем пункте не выполняется, то происходит присваивание значения элементу массива
pn[i]. Значение определяется следующим образом: еслиiбольше2, то это сумма значений элементовpn[i-1]иpn[i-3]. В противном случае значение равно1. - После этого вызывается рекурсивно функция
xn_recс аргументамиpnи++i. - В функции
mainпроисходит вывод на экран всех элементов массиваAчерез пробел. - В конце функции
mainвозвращается0, что означает успешное завершение работы программы.