Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Рекурсия Objective-C

0
 

Может ли функция вызвать сама себя? А почему бы и нет? Это называется рекурсией.

Возможно, вы слышали скучную длинную песню «99 бутылок пива». Создайте новую

программу командной строки С с именем BeerSong. Откройте файл main.c, добавьте функцию для вывода слов песни и вызовите ее из main():

#include <stdio.h>

void singTheSong(int numberOfBottles)

{

\n",

if (numberOfBottles == 0) {

printf("There are simply no more bottles of beer on the wall.\n");

} else {

printf("%d bottles of beer on the wall. %d bottles of beer.\n", numberOfBottles, numberOfBottles);

int oneFewer = numberOfBottles -­‐  1;

printf("Take one down, pass it around, %d bottles of beer on the wall.

oneFewer);

singTheSong(oneFewer); // This function calls itself!

printf("Put a bottle in the recycling, %d empty bottles in the bin.\n", numberOfBottles);

}

}

int main(int argc, const char * argv[])

{

singTheSong(99);

return 0;

}

Постройте и запустите программу. Результат будет выглядеть так;

99 bottles of beer on the wall. 99 bottles of beer.

Take one down, pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall. 98 bottles of beer.

Take one down, pass it around, 97 bottles of beer on the wall.

97 bottles of beer on the wall. 97 bottles of beer.

1 bottles of beer on the wall. 1 bottles of beer.

Take one down, pass it around, 0 bottles of beer on the wall. There are simply no more bottles of beer on the wall.

Put a bottle in the recycling, 1 empty bottles in the bin. Put a bottle in the recycling, 2 empty bottles in the bin.

Put a bottle in the recycling, 98 empty bottles in the bin. Put a bottle in the recycling, 99 empty bottles in the bin.

Как выглядит стек, когда со стены снимается последняя бутылка?

Вообще-то кадры и стек обычно не рассматриваются в начальном курсе программирования, но мой опыт показал. что эти идеи чрезвычайно полезны для неопытных программистов. Во-первых, они дают более конкретное понимание ответов на вопросы типа: «А что происходит c моими локальными переменными, завершает выполнение?» Во-вторых, они помогают разобраться в работе отладчика - программы, которая показывает, что происходит вашей программе (а эта информация

упрощает поиск и исправление ошибок). Когда вы строите и запускаете программу в

Xcode, отладчик присоединяется к программе, чтобы вы могли с ним работать.

Рис 5.5. Кадры вызовов рекурсивной функции в стеке

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии