Ответы пользователя по тегу Рекурсия
  • Рекурсивная функция на практике?

    begemot_sun
    @begemot_sun
    Программист в душе.
    В общем случае рекурсия это когда функция вызывает саму себя.

    Возьмем числа фибоначи: f(x)=f(x-1)+f(x-2), f(0) = 1, f(1) = 1

    Erlang код:
    ```
    f(0) -> 1;
    f(1) -> 1;
    f(X) -> f(X-1)+f(X-2).
    ```
    Это общая рекурсия, она не может быть оптимизирована т.к. результат исполнения зависит от результата исполнения той же функции с другими аргументами. Но данный результат зависит от чего-то еще, поэтому рекурсия не может быть оптимизирована (не хвостовая).

    Любой цикл:
    ```
    for i=10 to 1:
    do_something
    ```
    loop(0) -> ok;
    loop(N) ->
    do_something,
    loop(N-1).
    ```

    В данном случае рекурсия зовется хвостовой, т.к. результат текущего выполнения функции есть полностью результат выполнения функции для следующей итерации. Т.е. в данном случае компилятор\интерпретатор может не заботиться о том. чтобы отслеживать из какой функции была вызвана текущая функция. Он просто запомнил точку входа в данную рекурсию, и теперь знает что результат самого первого вызова будет результатом самого последнего.
    Т.е. другими словами вызов loop(3) будет эквивалентен коду:
    ```
    loop(3),
    loop(2),
    loop(1),
    ok.
    ```
    это обычный линейный код, который никак не является рекурсивным в общем смысле этого слова.
    Ответ написан
    3 комментария
  • Как найти замыкания (закольцованность) в цепочке методов?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Это определенно графы. Непонятна мотивация искать циклы.
    Например если вы боитесь что такая программа зациклиться - то нет, если вы будете использовать память для каждого результата.
    Если вы использовать память не намерены, и будете вычислять значения аргументов по мере надобности, то тут никаким графом не помочь. Вам всегда будут нужны результаты аргументов, которые зависят от ... которые за висят от .. и т.д. до бесконечности.
    Если вы хотите оптимизировать вычисления с помощью ленивости, то в любом случае нужна будет память.
    Ответ написан
    1 комментарий
  • Возможны ли самомодифицирующиеся, рекурсивно самоизменяющие свои реализации автоматические тесты к рекурсивно самоизменяющимся метапрограммам?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Что такое тест?
    Это верное утверждение относительного того что: f(a) = b.
    где f - это ваша программа (такой черный ящик, функция)

    В таком ключе самоизменяемых тестов не существует.

    Есть начальное состояние программы, есть алгоритм её работы (в черном ящике), и есть результат исполнения этой программы. Результат должен совпадать с тем, что было заложено ранее. т.е. f(a) должно быть рано b. Если не равно, то тест не прошел.

    Как можно изменить тест, чтобы получить другое покрытие начальных и конечных условий ?
    А никак. А вы вообще уверены будете, что данный тест покрывает именно те условия. Может быть, в данном случае, результат исполнения программы должен быть совершенно другой?
    Ответ написан
    Комментировать