![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
Интересно стало, вот и начал эксперимент. Задача вычисления быстрого вычисления числа в натуральной степени. Вот пара решений на C++:
Код:
Код:
Код:
Цикл ~327.317 мСек Но насколько я понимаю, в рекурсии используется концевая рекурсия и компилятор мог бы допереть до этого и сделать очень мощную оптимизацию, которая бы обошла "обычный" способ. И еще, есть ли еще способы, не прибегая к асму, оптимизировать оба метода? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Это не хвостовая рекурсия, т.к. два разных рекурсивных вызова может быть.
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]()
Продлите експеримент дальше - сделайте стек у вашего приложения 4КБ и дерзайте с рекурсией....
|
![]() |
![]() |
![]() |
#4 | |||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]() Цитата:
Цитата:
WTF o_O. Теперь появилась потребность выразить быстрое возведение в натуральную степень с хвостовой рекурсией. Хм, и как? Есть идеи или это невозможно? Цитата:
![]() Последний раз редактировалось Kostia; 11.12.2012 в 09:53. |
|||
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
Код:
Код:
Код:
Последний раз редактировалось Abstraction; 11.12.2012 в 09:59. |
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#7 | |||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]() Цитата:
Цитата:
![]() ![]() ![]() вообще раньше был __uint8_t, но потом все превратилось в 64 бита Ok. Ваши варианты уравняли производительность. Еще для меня стало непонятным то, что если в рекурсии передавать значения по ссылке, то скорость резко падает, почему? Как-то так на haskell перевел: Код:
Код:
Цитата:
Последний раз редактировалось Kostia; 11.12.2012 в 11:08. |
|||
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Хотя да. Пожалуй всё же там хвостовая рекурсия. Просто такую конструкцию проблематично оптимизатору развернуть, т.к. там условный вызов идёт, а условия имеют привычку предсказываться и выполняться наперёд.
|
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,692
|
![]()
есть еще такой вариант и он работает быстрее, вполне возможно что это из-за лишнего вызова функции?
Код:
|
![]() |
![]() |
![]() |
#10 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
синусы и ко. циклы, вроде циклы | Scorch92 | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 22.12.2010 19:26 |
Рекурсия | <Tyz> | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 18.12.2010 23:22 |
рекурсия | DinaraIITU | Помощь студентам | 3 | 04.11.2010 15:39 |
Рекурсия на С++ | Nitriyc | Помощь студентам | 0 | 28.04.2010 17:22 |
Циклы - вложенны циклы? | tigga | Microsoft Office Excel | 5 | 19.02.2010 23:36 |