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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсия в Java, ФП и его особености в Java 
:(
    Опции темы
integral
Дата 4.9.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



Недавно узнал, что JVM не поддержует хвлстовую рекурсию. Меня интересует, исправлення ли эта проблема в 1.5.0 или будет исправлення в будущем?


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
LSD
Дата 4.9.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

Репутация: 209
Всего: 537



Цитата(integral @  4.9.2006,  18:36 Найти цитируемый пост)
хвлстовую рекурсию

Шо? 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   Вверх
Void
Дата 4.9.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



LSD, tail recursion optimization. Wiki it.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
powerOn
Дата 4.9.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



Хвостовая рекурсия - это способ оптимизации рекурсивных вызовов. За счет того, что рекурсивная функция вызывается в последнюю очередь внутри себя, нет необходимости сохронять информацию в стеке о предыдущем вызове. Даная информация (например локальные переменные) записываются на старое место, за счет этого стек вызова не поглащает очередную порцию памяти. Вызов стоит на последнем месте, а значит после него ничего не последует (кроме возврата значения (если он есть)) и информация о текущем вызове уже не нужна. Так можно избежать переполнения стека. Этот механизм есть к примеру в замечатльном языке Prolog (Visual Prolog), но чтоб подобное было в Java... никогда не слышал  smile 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Sardar
Дата 4.9.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Под JVM технически реализуемо, но что бы об этом кричали маркетологи не слышал...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Nobody
Дата 6.9.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

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



Она её очень даже поддерживает, как и любую другую рекурсию. Более того. Когда догадывается, что это она, то оптимизирует до циклов.

Это сообщение отредактировал(а) Nobody - 6.9.2006, 17:06


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
powerOn
Дата 6.9.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



Цитата(Nobody @  6.9.2006,  18:05 Найти цитируемый пост)
Она её очень даже поддерживает

 smile 



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Nobody
Дата 7.9.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

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





--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
powerOn
Дата 7.9.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



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

Это сообщение отредактировал(а) MoonCat - 7.9.2006, 15:55


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Skipy
Дата 7.9.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Цитата(MoonCat @ 4.9.2006,  21:43)
За счет того, что рекурсивная функция вызывается в последнюю очередь внутри себя...

А кто это сказал???


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
powerOn
Дата 7.9.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



Цитата(Skipy @  7.9.2006,  18:26 Найти цитируемый пост)
А кто это сказал??? 

Ну цитата на мой пост указывает. Значит я и сказал.  smile 

А вообще в книге по Visual Prolog так написано. Было время писал я код на нем, вот и запомнил....


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Skipy
Дата 7.9.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Цитата(MoonCat @ 7.9.2006,  17:31)
А вообще в книге по Visual Prolog так написано. Было время писал я код на нем, вот и запомнил....

Запомнили - это хорошо. Вот только кто сказал, что в рекурсии собственный вызов идет последним? Как напишете - так и будет. Если у Вас f(n) = f(n-1)*f(n-2), то вызовов внутри будет ДВА. И вызов f(n-1) не будет последним.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Nobody
Дата 7.9.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

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



Короче. Хвостовая рекурсия ничем не отличается от обычной рекурсии. Просто когда рекурсивный вызов является последним оператором, метод можно изменить так, что в нём не будет рекурсии, а будет цикл, что повысит производительность.


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
Bozo
Дата 7.9.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Nobody, а будет цикл, что повысит производительность. 
Во сколько раз?

Если нужна производительность, ну и пишите на C#, или языках, поддерживающих хвостовую рекурсию. Зачем Java-то? Вы знаете, что Clean пока удерживает пальму первенства по сортировке? Вот и пишите на нем.
PM   Вверх
powerOn
Дата 7.9.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

Репутация: 47
Всего: 159



Цитата(Bozo @  7.9.2006,  21:59 Найти цитируемый пост)
Зачем Java-то? 

За тем, чтоб лучше было. Стремление к лючшему - это хорошее дело.


Цитата(Skipy @  7.9.2006,  20:28 Найти цитируемый пост)
Вот только кто сказал, что в рекурсии собственный вызов идет последним? Как напишете - так и будет.


Совершенно с вами согласен. Как напишем - так и будет.
В своем посте, я имел ввиду только хвостовую рекурсию, и то, что её особенность - это рекурсивный вызов на последем месте. Она даже поэтому и называется хвостовой. Её можно оптимизировать (как правельно заметил Nobody) и некоторые компиляторы делаю это автоматически. Но увы, java компилятор этого не делает (и как правельно заметил Sardar, что технически это выполнимо).





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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