10.19 Рекурсия

Backtrace

Вызов функции:

   1 #include <execinfo.h>
   2 #include <stdio.h>
   3 
   4 void dump() {
   5         void* buffer[128];
   6         int frames = backtrace(buffer, 128);
   7         backtrace_symbols_fd(buffer, frames, 1);
   8 }
   9 
  10 void second() {
  11         dump();
  12 }
  13 
  14 void first() {
  15         second();
  16 }
  17 
  18 int main(void) {
  19         printf("%p %p %p %p\n", main, first, second, dump);
  20         first();
  21         return 0;
  22 }

Рекурсия в Си

Рекурсия в Си — это просто ситуация, когда функция в конце концов вызывает себя же.

void rec(int a, int b) {
        printf("%d %d\n", a, b);
        if(a)
                rec(0, a);
        else
                b=0;
        printf("%d %d\n", a, b);
}

void main(void) {
        rec(1, 2);
        return 0;
}

Алгоритмическая рекурсия

:)) Сколько проходов цикла в примере выше? Что является основанием рекурсии?

Свободные и связанные переменные

TODO это мутная тема для Си — придётся рассказывать как минимум про локальные функции, а то и про trampoline / замыкание. Закомментировать?

Принцип уместности рекурсии

Критерий уместности: вложенность рекурсивных вызовов при обработке n элементов данных не должна превышать log(n)(строго говоря — O(log(n)), то есть логарифм, умноженный на константу).

Указатели на функцию

Как мы уже видели, имена функций — это их адреса, а значит, это указатели. И их можно передавать как параметры! Только тип указать.

Д/З

TODO Четыре задачи на рекурсию: тупенькая, две средние, среднесложная

Возможно, тут: https://grep.cs.msu.ru/kufas.ru.patched/programming201.htm или тут http://grep.cs.msu.ru/narhoz-chita.ru/zadachnik/Glava12/index12.htm#z455

Если рекурсия неуместна, сказать об этом

LecturesCMC/AL/Prac/14_Recursion (последним исправлял пользователь FrBrGeorge 2026-10-17 23:25:59)