Пока цикл с функциями? - PullRequest
       5

Пока цикл с функциями?

0 голосов
/ 03 декабря 2011

Мне было интересно, можно ли что-то подобное использовать в коде.Если бы у меня был блок кода, который я хотел бы выполнить, который был бы одинаковым во многих частях программы, и он использовал эту версию цикла while, это сработало бы?(Я знаю, что мог бы использовать цикл while, я просто подумал, что это будет интересная идея для изучения)

NSMutableArray *objects;
-(void) RemoveObjectLoop
{
    [self RemoveObjectAtZero];
}

-(void) RemoveObjectAtZero
{
    if([objects count] > 0)
    {
        [objects removeObjectAtIndex:0];
        [self RemoveObjectLoop];
    }
}

Вместо того, чтобы записывать цикл while несколько раз, просто сделайте [self RemoveObjectLoop].Может ли это работать для проекта?Есть ли какой-нибудь случай, когда вы не хотели бы использовать это?

Редактировать: я знаю, что этот пример плохой, я просто не мог думать ни о чем другом.Если вы могли бы, пожалуйста, включите пример в свой ответ.Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Это называется рекурсия.В языках, которые не оптимизируют его, его можно использовать только для коллекций среднего размера, потому что в конечном итоге вам не хватит места в стеке для хранения фреймов, необходимых для функций.Он также несколько медленнее, чем обычный цикл (опять же, если компилятор не оптимизирует его).

Для некоторых алгоритмов это хорошо подходит.Например, поиск в глубину естественно реализован как рекурсивные функции.Я не думаю, что это один из тех случаев.

1 голос
/ 03 декабря 2011

В рекурсии у вас обычно не было бы циклического вызова функции, подобного этому.Функция просто вызовет себя, работая над выводом.В качестве примера можно привести:

-(void) RemoveAll
{
    if([objects count] > 0)
    {
        [objects removeObjectAtIndex:0];
        [self RemoveAll];
    }
}

Некоторые языки (например, Logo) автоматически оптимизируют хвостовую рекурсию (где рекурсивный вызов - последняя строка функции).Я никогда не слышал о том, чтобы Objective-C делал это, и я был бы удивлен, если бы это было так.решается не рекурсивно. Вот несколько реальных примеров рекурсии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...