Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Тяпничная хвостовая рекурсия.  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
petrav
пропущено...

Они (деструкторы) начнут вызываться в неправильной последовательности. Это принципиально.

Или же они вообще перестанут вызываться.

А как деструкторы связаны с хвостовой рекурсией?

Я понял тему топика так:
void foo(int a)
{
    ++a;
    if (a>6)
    {
        return;
    }
    else
    {
       foo(a);
    }
}

Я корректно всё понял? И вместо рекурсии в ассемблере будет jump на начало функции?

Сообщение было отредактировано: 30 дек 20, 20:32
30 дек 20, 20:36    [22257389]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная хвостовая рекурсия.  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
petrav

void foo(int a)
{
    ++a;
    if (a>6)
    {
        return;
    }
    else
    {
       foo(a);
    }
}

Я корректно всё понял? И вместо рекурсии будет jump на начало функции?

Я не силен в теории построения компилляторов. Но по моему свертка хвоста превращает рекурсию
в банальный loop. Как там в ассемблере делется loop? Я щас не помню. Много вариантов.
Да можно jump сделать. А можно JNZ (jump-non-zero-flag). Суть вобщем не в этом.
А в том что стек не будем потреблять.

И еще убийственная киллер фича всей функциональщины - все переменные в такой
функции становятся values. Константами. Раз нет цикла. То ничего и не меняется.

Вселенная с застывшим временем.
30 дек 20, 20:41    [22257394]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная хвостовая рекурсия.  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton

Я не силен в теории построения компилляторов. Но по моему свертка хвоста превращает рекурсию
в банальный loop. Как там в ассемблере делется loop? Я щас не помню. Много вариантов.
Да можно jump сделать. А можно JNZ (jump-non-zero-flag). Суть вобщем не в этом.
А в том что стек не будем потреблять.

И еще убийственная киллер фича всей функциональщины - все переменные в такой
функции становятся values. Константами. Раз нет цикла. То ничего и не меняется.

Вселенная с застывшим временем.

Отлично. Я как раз недавно смотрел научно популярный ролик как вернуть время назад. На Физике Побединского.
Но вернёмся к деструкторам и доработаем код.

void foo(int a)
{
    MyObject obj;
    ++a;
    if (a>6)
    {
        return;
    }
    else
    {
       foo(a);
    }
}


Тут два варианта:

- При честной рекурсии у нас деструкторы класса MyObject вызываются в правильной последовательности.
- А при фокусах с разворачиванием рекурсии в цикл что с ними будет? ПНХ?
30 дек 20, 20:49    [22257397]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная хвостовая рекурсия.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
petrav,

в вашем примере для компилятора нет хвостовой рекурсии
так как вызов не хвостовой, он такой лишь на первый взгляд
30 дек 20, 20:58    [22257401]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная хвостовая рекурсия.  [new]
petrav
Member

Откуда:
Сообщений: 2861
kealon(Ruslan)
petrav,

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

Конечно, я понимаю, что деструктор неявно вызывается в конце функции. Упрощённо.
Но что будет если MyObject изначально был алиасом к int, а потом я переделал MyObject на класс с деструктором?
Поэтому я сразу и написал, что тогда в язык нужно добавить атрибут к функции "настаиваю на хвостовой рекурсии".
Не получилось -- сбой компиляции.
30 дек 20, 21:03    [22257408]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничная хвостовая рекурсия.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
petrav
Поэтому я сразу и написал, что тогда в язык нужно добавить атрибут к функции "настаиваю на хвостовой рекурсии".
Не получилось -- сбой компиляции.
я тоже так думаю - "явное лучше неявного"
30 дек 20, 21:25    [22257427]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / C++ Ответить