8.10 Рекурсивные функции

 

Функции языка си могут использоваться рекурсивно, т. е. Функция может явно или косвенно обращаться к себе самой. При каждом вызове будут образовываться новые локальные переменные, совершенно не зависящие от предыдущего набора.

Пример

Обращение строки: asd -> dsa

         mirror(char *string)

{

         char symbol=*string;

         string++;

         if (*string!=’\0’)

                   mirror(string);

         putchar(symbol);

}

вызовфункции mirror ввиде mirror(“asd”); приведетквыводунадписи dsa

На первом этапе параметру string будет присвоено значение указателя на знак ‘a’, а переменной symbol – значение ‘a’. После чего произойдет увеличение указателя string и он станет указывать на знак ‘s’. Т. к. * string!=0, то произойдет опять вызов функции mirror.

На втором этапе, образованные новые локальные переменные string и symbol получат соответственно значения указатель на знак ‘s’ и значение ‘s’. После чего произойдет увеличение указателя string и он станет указывать на знак ‘d’. Т. к. * string!=0, то произойдет опять вызов функции mirror.

На третьем этапе, образованные новые локальные переменные string и symbol получат соответственно значения указатель на знак ‘d’ и значение ‘d’. После чего произойдет увеличение указателя string и он станет указывать на знак признак конца строки ‘\0’.

Т. к. * string==’\0’, произойдет переход к выполнению стандартной функции putchar, что приведет к выводу значения переменной symbol, т. е. выводу символа ‘d’.

Закончится выполнение функции.

При возврате с третьего этапа произойдет печать значения переменной symbol, присвоенного ей на втором этапе, т. е. символа ‘s’. А при возврате со второго этапа произойдет печать значения переменной symbol, присвоенного ей на первом этапе, т. е. символа ’a’.

На этом закончится выполнение функции mirror(“asd”); 

 

 

К оглавлению

Назад к разделу "8.9. Место определения и обращения к функции"

Вперед к разделу "8.11. Структуры"