Re[10]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 04.09.09 18:39
Оценка:
Здравствуйте, nikov, Вы писали:

N>Мое мнение — компиляторы пока недостаточно умны для таких задач.


Согласен. Я верю что за декларативным программированием будующее. В каком направлении сейчас идет раввитие функцональных языков? Достигнут ли технолонический предел умности? Ведется ли разработка сред выполнения для функциональных языков ( я писал в одном из постов) или аппартных решений (например как ЛИСП — машина), позволяющих повысить производительность?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[11]: Преобразование рекурсии в цикл
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.09.09 19:21
Оценка:
Здравствуйте, igor-booch, Вы писали:

N>>Мое мнение — компиляторы пока недостаточно умны для таких задач.


IB>Согласен. Я верю что за декларативным программированием будующее. В каком направлении сейчас идет раввитие функцональных языков?

Есть гибридные функционально-логические языки, например Curry.
Есть языки с зависимыми типами, например Agda 2.

IB>Достигнут ли технолонический предел умности?

А разве он есть?
Re[11]: Преобразование рекурсии в цикл
От: FR  
Дата: 05.09.09 05:10
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Кто-нибудь встречал императивно-декларативные языки с декларацией чистоты?


Императивные есть, Digitalmars D http://www.digitalmars.com/d/2.0/function.html#pure-functions
Re[11]: Преобразование рекурсии в цикл
От: VoidEx  
Дата: 05.09.09 11:22
Оценка: :)
Здравствуйте, igor-booch, Вы писали:

IB>Программист должен стремиться к тому чтобы как можно больше кода было чистым. Декларация чистоты отделяет чистый код от нечистого. А так получается, что всё смешивается и мы не можем задействовать преимущества функциональных языков.


IB>Кто-нибудь встречал императивно-декларативные языки с декларацией чистоты?

Ну, как известно, Haskell — лучший императивный язык
Re[5]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 06.09.09 08:27
Оценка:
Здравствуйте, nikov, Вы писали:

N>Можно написать алгоритм, имеющий сложность по времени O(Log(N)).


Напишите, пожалуйста
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[6]: Преобразование рекурсии в цикл
От: nikov США http://www.linkedin.com/in/nikov
Дата: 06.09.09 08:59
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Здравствуйте, nikov, Вы писали:


N>>Можно написать алгоритм, имеющий сложность по времени O(Log(N)).


IB>Напишите, пожалуйста


http://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form
Ну, а возвести матрицу в степень N за O(Log(N)) уже несложно.
Re[6]: Преобразование рекурсии в цикл
От: Mr.Cat  
Дата: 06.09.09 14:51
Оценка:
Здравствуйте, igor-booch, Вы писали:
IB>Напишите, пожалуйста
Есть в sicp с подробным объяснением.
Re[6]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 06.09.09 17:44
Оценка:
Можно даже O(C) через формуле Бине:

http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8#.D0.A4.D0.BE.D1.80.D0.BC.D1.83.D0.BB.D0.B0_.D0.91.D0.B8.D0.BD.D0.B5
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[7]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 06.09.09 17:47
Оценка:
Можно даже O(C) через формуле Бине:

http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8#.D0.A4.D0.BE.D1.80.D0.BC.D1.83.D0.BB.D0.B0_.D0.91.D0.B8.D0.BD.D0.B5
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[6]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 06.09.09 18:16
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, igor-booch, Вы писали:

IB>>По времени сложность тоже экспонентциальная:
MC>Потому что ты такой алгоритм написал:
IB>> | n => Fib(n — 1) + Fib(n — 2)
MC>fib(n) = fib(n-1) + fib(n-2) = [fib(n-2) + fib(n-3)] + [fib(n-3) + fib(n-4)] = ...
MC>Заметь, что fib(n-3) раздвоился. Т.е. алгоритм делает кучу повторных вычислений.


Попытался для интереса найти количество вызовов моей рекурсивной функции, как функцию от номера числа Фибоначчи, получилось рекурсивное уравнение:




Mathematica 7.0 его не решает:

a[n] == 1 + \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(i = 0\), \(\(-2\) + n\)]\(a[
i]\)\) + \!\(
\*UnderoverscriptBox[\(\[Sum]\), \(i = 0\), \(\(-1\) + n\)]\(a[i]\)\)

Можно интересно решить такое
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[7]: Преобразование рекурсии в цикл
От: nikov США http://www.linkedin.com/in/nikov
Дата: 06.09.09 20:10
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Можно даже O(C) через формуле Бине:


IB>http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8#.D0.A4.D0.BE.D1.80.D0.BC.D1.83.D0.BB.D0.B0_.D0.91.D0.B8.D0.BD.D0.B5


Каким алгоритмом будем иррациональное число в степень возводить?
Re[8]: Преобразование рекурсии в цикл
От: Аноним  
Дата: 06.09.09 20:41
Оценка:
Здравствуйте, nikov, Вы писали:

N>Каким алгоритмом будем иррациональное число в степень возводить?


Да не об этом речь, 32-битные или 64-битные числа вообще можно по табличке возвращать.
Re[7]: Преобразование рекурсии в цикл
От: Mr.Cat  
Дата: 07.09.09 05:32
Оценка:
Здравствуйте, igor-booch, Вы писали:
IB>Попытался для интереса найти количество вызовов моей рекурсивной функции, как функцию от номера числа Фибоначчи, получилось рекурсивное уравнение
Если я правильно посчитал, то получается сумма чисел фибоначчи от 1-го до n-го за исключением n-1-го.
Re[9]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 07.09.09 17:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, nikov, Вы писали:


N>>Каким алгоритмом будем иррациональное число в степень возводить?


А>Да не об этом речь, 32-битные или 64-битные числа вообще можно по табличке возвращать.


По какой табличке?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[8]: Преобразование рекурсии в цикл
От: igor-booch Россия  
Дата: 07.09.09 17:42
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, igor-booch, Вы писали:


IB>>Можно даже O(C) через формуле Бине:


IB>>http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8#.D0.A4.D0.BE.D1.80.D0.BC.D1.83.D0.BB.D0.B0_.D0.91.D0.B8.D0.BD.D0.B5


N>Каким алгоритмом будем иррациональное число в степень возводить?


Действительно, формула возвращает число с плавающей точкой. При расчёте больших чисел Фибоначчи может появиться погрешность. Наверное нужны специальные аппаратные решения или виртуальные машины заточенные под функцианальное программирование.

Интересно как с этой задачей справилась бы ЛИСП машина?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[10]: Преобразование рекурсии в цикл
От: nikov США http://www.linkedin.com/in/nikov
Дата: 07.09.09 17:45
Оценка:
Здравствуйте, igor-booch, Вы писали:

А>>Да не об этом речь, 32-битные или 64-битные числа вообще можно по табличке возвращать.


IB>По какой табличке?


Имеется в виду, что в 64-битный интервал влезает меньше 100 первых чисел Фибоначчи. Можно их заранее посчитать, и потом доставать из таблицы за константное время.
Re[10]: Преобразование рекурсии в цикл
От: geniepro http://geniepro.livejournal.com/
Дата: 08.09.09 04:20
Оценка:
Здравствуйте, nikov, Вы писали:

N>Мое мнение — компиляторы пока недостаточно умны для таких задач.


LLVM умеет переводить наивные алгоритмы Фибоначчи и факториала в хвостовую рекурсию.
Re[11]: Преобразование рекурсии в цикл
От: Кодт Россия  
Дата: 08.09.09 12:37
Оценка:
Здравствуйте, geniepro, Вы писали:

G>LLVM умеет переводить наивные алгоритмы Фибоначчи и факториала в хвостовую рекурсию.


Может, он заточен распознавать и переделывать именно эти алгоритмы? Чтобы приятно удивлять студентов и внушать им иллюзии всемогущего разгильдяйства.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[11]: Преобразование рекурсии в цикл
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 08.09.09 13:01
Оценка:
Здравствуйте, geniepro, Вы писали:

G>LLVM умеет переводить наивные алгоритмы Фибоначчи и факториала в хвостовую рекурсию.


GCC тоже это делает давно.
Re[12]: Преобразование рекурсии в цикл
От: FR  
Дата: 08.09.09 14:47
Оценка:
Здравствуйте, D. Mon, Вы писали:

G>>LLVM умеет переводить наивные алгоритмы Фибоначчи и факториала в хвостовую рекурсию.


DM>GCC тоже это делает давно.



VC тоже но ему нужна подсказка:

#pragma inline_recursion(on)

И потом из фибоначчи в пару сишных строк получаем ассемблерный листинг в 10 тысяч строк, все что можно развернуто в CPS вызовы с хвостовой рекурсией
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.