C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C функції. Рекурсивні функції


Рекурсивні функції - це функції, які викликають самі себе.

Наприклад, уявімо обчислення факторіала у вигляді рекурсивної функції:

#include <stdio.h>
 
int factorial(int n)
{
    if (n == 1)
    {
        return 1;
    }
    else
    {
        return n * factorial(n - 1);
    }
}
 
int main(void)
{
    int result = factorial(6);
    printf("%d \n", result);    // 720
     
    return 0;
}

У функції factorial задана умова, що якщо число n не дорівнює 1 , то це число множиться на результат цієї ж функції, в яку як параметр передається число n-1 . Тобто відбувається рекурсивний спуск. І так далі, поки не дійдемо того моменту, коли значення варіанту не буде дорівнювати одиниці.

Рекурсивна функція обов'язково повинна мати певний базовий варіант, який використовує оператор return і до якого в підсумку сходяться всі інші виклики. У випадку з факторіалом базовий варіант представляє умову, коли n = 1 , в цьому випадку спрацює інструкція return 1; .

І також усі рекурсивні виклики повинні звертатися до підфункції, які врешті-решт сходяться до базового варіанту. Так, при передачі в функцію додатнього числа при подальших рекурсивних викликах підфункцій в них буде передаватися кожен раз число, менше на одиницю. І врешті-решт ми дійдемо до ситуації, коли число дорівнюватиме 1 , і буде використаний базовий варіант.

Однак рекурсивний спосіб вирішення завдання не завжди є оптимальним. Треба враховувати, що при кожному зверненні до рекурсивної функції виділяється нова ділянка пам'яті для всіх її параметрів і змінних. І в даному випадку те саме завдання по знаходженню факторіала куди оптимальніше вирішити за допомогою циклів.

Іншим поширеним показовим прикладом рекурсивної функції служить функція, що обчислює числа Фіббоначчі.

n -й член послідовності Фібоначчі визначається за формулою:

f (n) = f(n-1) + f(n-2) , причому f(0) = 0 , а f(1) = 1 .

Значення f(0) = 0 і f(1) = 1 визначають базові варіанти для даної функції:

int fibonachi(int n)
{
    if (n == 0)
    {
        return 0;
    }
    if (n == 1)
    {
        return 1;
    }
    else
    {
        return fibonachi(n - 1) + fibonachi(n - 2);
    }
}

Наш партнер:
beta test mp3 playlist downloader