Как работает рекурсия в функции?

Рейтинг: 0Ответов: 1Опубликовано: 13.01.2023

Можете, пожалуйста, объяснить как работает данная рекурсия (функция calculatingFunction). Буду очень благодарен!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long long calculatingFunction(int* arrayPointer, int arrayBegin, int arrayEnd){
   if(arrayEnd-arrayBegin==0){
       return arrayPointer[arrayBegin];
   }
   else if(arrayEnd-arrayBegin==1){
       return arrayPointer[arrayBegin]*arrayPointer[arrayEnd];
   }
   else{
       long long first = calculatingFunction(arrayPointer, arrayBegin, (arrayEnd+arrayBegin)/2 );
       long long second = calculatingFunction(arrayPointer, ((arrayEnd+arrayBegin)/2)+1, arrayEnd);
       return first*second;
   }
}

int main() {
   srand(time(NULL));
   int *arrayPointer, arraySize;
   printf("Write array size, which you want to parse into product \n");
   scanf("%d", &arraySize);
   arrayPointer = malloc(sizeof(int) * arraySize);
   for (int i = 0; i < arraySize; i++) {
       arrayPointer[i] = rand() % 101;
   }
   printf("Your array:\n");
   for (int i = 0; i < arraySize; i++) {
       printf("%d ", arrayPointer[i]);
   }
   printf("\n");
   long long resultOfCalculating = calculatingFunction(arrayPointer, 0, arraySize - 1);
   printf("Result of calculating product is:\n%lld", resultOfCalculating);
   free(arrayPointer);
}

Ответы

▲ 3Принят

Вычисляет произведение элементов массива от arrayBegin до arrayEnd.

long long calculatingFunction(int* arrayPointer, int arrayBegin, int arrayEnd){
   // Если arrayBegin и arrayEnd совпадают (один элемент),
   // просто возвращает его
   if(arrayEnd-arrayBegin==0){
       return arrayPointer[arrayBegin];
   }
   // Если же это 2 элемента, возвращает их произведение
   else if(arrayEnd-arrayBegin==1){
       return arrayPointer[arrayBegin]*arrayPointer[arrayEnd];
   }
   else{
       // Иначе делит диапазон пополам, считает произведения в первой половине
       long long first = calculatingFunction(arrayPointer, arrayBegin, (arrayEnd+arrayBegin)/2 );
       // и во второй
       long long second = calculatingFunction(arrayPointer, ((arrayEnd+arrayBegin)/2)+1, arrayEnd);
       // и возвращает их произведение...
       return first*second;
   }
}