Должен ли я обернуть рекурсивный шаг в "другое"?

Возможный дубликат:
еще или вернуть?

Рассмотрим типичную рекурсивную функцию:

public int Fact(n) 
{
    if (n < 2)
    {
        return 1;
    }
    else
    {
        return n * Fact(n-1);
    }
}

Какая разница между написанием этого и таким образом?:

public int Fact(n) 
{
    if (n < 2)
    {
        return 1;
    }

    return n * Fact(n-1);
}

Я предпочитаю последнее, особенно когда рекурсивный шаг состоит из множества строк кода. Я не хочу добавлять ненужные отступы.

Есть ли практическая разница или это просто стилистическое предпочтение?

6 ответов

Решение

Это просто вопрос стиля. Обычно я не использую блоки else, когда возвращается конец блока then.

Нет, разницы нет. Если выражение "If" истинно, оно переходит к 1-му оператору возврата. Если это не так, то программа перейдет ко второму оператору возврата.

Между ними нет практической разницы. Это зависит от ситуации и среды, в которой вы живете.

Функции полностью эквивалентны. Это вопрос личных предпочтений, но некоторые IDE могут жаловаться на первую версию, поскольку else не нужно Но некоторые могут утверждать, что первую версию легче читать.

РЕДАКТИРОВАТЬ: Кажется, этот ответ вызывает некоторую путаницу. Сначала я написал его, затем удалил, но затем я все еще получал сообщения и запросы на его содержание. Так что вот он снова в сети.

Проблема в том, что вопрос редактировался несколько раз, радикально меняя его значение: когда я впервые ответил на него, он был помечен как python и содержал код python. К тому времени, когда я получил первое голосование, вопрос был помечен C++, и люди начали комментировать "опции оптимизации компилятора".

Итак: здесь снова идет исходный ответ, но имейте в виду, что это относится к питону.


Есть ли практическая разница или это просто стилистическое предпочтение?

Вопреки распространенному мнению, есть и практическая разница: производительность! Имеет ли разница какое-либо значение в вашем приложении, зависит... но если ваш код вызывается рекурсивно или в цикле:

>>> T(lambda : fact1(1)).repeat(number=10000000)
[2.5754408836364746, 2.5710129737854004, 2.5678811073303223]
>>> T(lambda : fact2(1)).repeat(number=10000000)
[2.8432059288024902, 2.834425926208496, 2.8364310264587402]

где fact1 определяется как функция with-else, и fact2 это тот, без

НТН!

Нет никакой разницы. Дело в том, что при рекурсивном вызове функции вы возвращаете конкретное значение или возвращаете возврат того же вызова функции.

Другие вопросы по тегам