Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так не любят Delphi? 
:(
    Опции темы
diadiavova
Дата 17.4.2013, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(LSD @  17.4.2013,  11:35 Найти цитируемый пост)
 вот если обрабатывать рекурсивно списки то глубина рекурсии растет линейно и тут получить СО вполне реально.

А зачем? Если при обработке дерева рекурсия всё сильно упрощает, а в случае со списками она никакой выгоды не даёт. Тут ведь была высказана мысль, что единственный результат от использования рекурсии - опасность переполнения стека.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
serger
Дата 17.4.2013, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



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


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Фантом
Дата 17.4.2013, 11:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(diadiavova @  17.4.2013,  11:50 Найти цитируемый пост)

А зачем? Если при обработке дерева рекурсия всё сильно упрощает, а в случае со списками она никакой выгоды не даёт.

Со списками удобно работать в функциональном стиле, а в этом случае рекурсия будет встречаться часто.
PM   Вверх
LSD
Дата 17.4.2013, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(Фантом @  17.4.2013,  12:44 Найти цитируемый пост)
Со списками удобно работать в функциональном стиле

 smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
diadiavova
Дата 17.4.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Фантом @  17.4.2013,  12:44 Найти цитируемый пост)
Со списками удобно работать в функциональном стиле, а в этом случае рекурсия будет встречаться часто.

В функциональном стиле удобно работать тогда, когда язык к этому приспособлен. Кроме того, функцональный стиль - это не только рекурсия, а ещё и набор готовых функций типа ( map, fold, lter и т. д.). В дотнете это, например, linq-запросы, это тоже функцинальный стиль. И ещё не надо забывать о том, что в чистых функциональных языках циклов и переменных вообще нет, так что там их замена рекурсией и аккумуляторами соответственно, - используются не только и зачастую не столько из-за того, что циклы хуже.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
k0rvin
Дата 17.4.2013, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Где вы тут хвостовую рекурсию увидели? Хвостовая рекурсия -- это вот:
Код

(define (test-tail depth (acc 0))
  (if (<= depth 0)
      acc
      (test-tail (- depth 1) (+ acc depth))))


Код

(require racket/trace)
(trace test-rec)
(trace test-tail)

Код

(test-rec 3)
; >(test-rec 3)
; > (test-rec 2)
; > >(test-rec 1)
; > > (test-rec 0)
; < < 0
; < <1
; < 3
; <6
; 6

Код

(test-tail 3)
; >(test-tail 3)
; >(test-tail 2 3)
; >(test-tail 1 5)
; >(test-tail 0 6)
; <6
; 6



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
diadiavova
Дата 17.4.2013, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(k0rvin @  17.4.2013,  14:09 Найти цитируемый пост)
Где вы тут хвостовую рекурсию увидели? 

О хвостовой рекурсии я упомянул в ответ на ссылку из поста, следующего за твоим.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
serger
Дата 17.4.2013, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Цитата(diadiavova @  17.4.2013,  13:03 Найти цитируемый пост)
В функциональном стиле удобно работать тогда, когда язык к этому приспособлен.

Я бы сказал, всё же ...
Цитата(Фантом @  17.4.2013,  12:44 Найти цитируемый пост)
Со списками удобно работать в функциональном стиле

И соответственно ...
Цитата(diadiavova @  17.4.2013,  13:03 Найти цитируемый пост)
В функциональном стиле удобно работать тогда, когда язык к этому приспособлен.


 smile 


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
diadiavova
Дата 17.4.2013, 19:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



serger, то ли ты меня не понял, то ли я тебя. Поясню, о чем я говорил. Насколько я понял, твоя ссылка на статью о хвостовой рекурсии призвана была сказать, что рекурсию можно оптимизировать и тогда она не будет вызывать тех проблем, которых обычно опасаются при ее использовании. На что я тебе ответил, что хвостовая рекурсия - штука довольно хитрая и приведя рекурсию к хвостовому виду, действительно можно избавиться от опасности переполнения стека, но только в том случае, если ее оптимизация поддерживается на уровне языка. Функциональные языки поддерживают такую оптимизацию всегда, это одна из фич функциональных языков. Вот приведу пример простейшей функции на F#, функция вычисляет сумму всех чисел в списке
Код

let rec lsum l acc =
    match l with
    [] -> acc
    | head::tail -> lsum tail (acc + head)
Для простоты не стал прятать аккумулятор в замыкании, это не имеет отношения к данному вопросу.  Логика тут проста: функция принимает список чисел и аккумулятор как аргументы и если список пуст - возвращается значение аккумулятора  [] -> acc, в ином случае - вызывается рекурсивно и в качестве списка подается хвост(список без первого элемента), в качестве аккумулятора - сумма полученного аккумулятора и первого элемента head::tail -> lsum tail (acc + head)
Теперь если скомпилировать этот код и просмотреть в декомпиляторе на C#, то никакой рекурсии ты там не увидишь, а увидишь буквально следующее
Код

public static int lsum(FSharpList<int> l, int acc)
{
    while (l.TailOrNull != null)
    {
        FSharpList<int> fSharpList = l;
        FSharpList<int> tail = fSharpList.TailOrNull;
        int head = fSharpList.HeadOrDefault;
        FSharpList<int> arg_1F_0 = tail;
        acc += head;
        l = arg_1F_0;
    }
    return acc;
}

Или на бейсике
Код

Public Shared Function lsum(l As FSharpList(Of Integer), acc As Integer) As Integer
    While l.TailOrNull IsNot Nothing
        Dim fSharpList As FSharpList(Of Integer) = l
        Dim tail As FSharpList(Of Integer) = fSharpList.TailOrNull
        Dim head As Integer = fSharpList.HeadOrDefault
        Dim arg_1F_0 As FSharpList(Of Integer) = tail
        acc += head
        l = arg_1F_0
    End While
    Return acc
End Function
То есть по сути обработка происходит с помощью цикла и никакой рекурсии.

Теперь, если подобный код написать на C#
Код

        int lsum(IEnumerable<int> l, int acc)
        {
            if (l.Count() == 0) return acc;
            return lsum(l.Skip(1), acc+l.First());
        }
То декомпилятор выдает ровным счетом то же самое, что и было написано в коде, а стало быть на C# хвостовая рекурсия точно так же может привести к переполнению стека, как и любая другая.

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Zloxa
Дата 17.4.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 4
Всего: 161



diadiavova, ты лапа!!!! smile

Совершенно не могу понять, как у тебя так получилось, что прочитав твой ответ, мало что в нем поняв, у меня таки осталось наистойчайшее ощущение, что serger не прав, и член партии "Справедливая Россия".

Искренне завидую твоей такой способности, искренне сожалею, что ты не любишь Делфи  smile 

Это сообщение отредактировал(а) Zloxa - 17.4.2013, 19:30


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
SKrivosein
Дата 17.4.2013, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: нет
Всего: 8



Zloxa а я впечатлён тем что у daidaivova нашлось желание разобратся в F#. Я три раза пытался и дальше простейших примеров дело нешло. Какой же я ленивый.... smile  smile 
Также я тоже в первой части ничего не понал  smile 


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
Zloxa
Дата 17.4.2013, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 4
Всего: 161



Цитата(SKrivosein @  17.4.2013,  23:29 Найти цитируемый пост)
нашлось желание разобратся в F#

Признаюсь, во всем дойнете для меня привлекательными выглядят пока лишь F# и linq


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
diadiavova
Дата 17.4.2013, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Zloxa @  17.4.2013,  20:29 Найти цитируемый пост)
мало что в нем поняв

Цитата(SKrivosein @  17.4.2013,  23:29 Найти цитируемый пост)
Также я тоже в первой части ничего не понал

А что именно непонятно? smile Если убрать примеры кода и пояснения к ним, то смысл поста в том, что F#-овский компилятор преобразует хвостовую рекурсию в цикл, а C#-овский этого не делает. Поэтому в последнем использовать ее для оптимизации бесполезно. Такая же ситуация и в других языках(оптимизируется в основном только в функциональных).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Zloxa
Дата 17.4.2013, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 4
Всего: 161



Цитата(diadiavova @  17.4.2013,  23:39 Найти цитируемый пост)
А что именно непонятно? 

К чему было все это изложение и разложение по полочкам.  smile 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
diadiavova
Дата 17.4.2013, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Zloxa @  18.4.2013,  00:14 Найти цитируемый пост)
К чему было все это изложение и разложение по полочкам.

К тому, что до этого я упомянул хвостовую рекурсию и в ответ получил два поста, из которых следовало, что меня просто не поняли. Я решил изложить все подробно, чтобы не было непоняток. Но как выяснилось, это вызывало еще больше непоняток и теперь я уже сам не понимаю, надо ли что-то еще объяснять, поскольку, судя по всему, мои объяснения не проясняют ситуацию, а даже наоборот smile


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.