|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
11.12.2012, 09:15 | #1 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Рекурсия VS Циклы
Интересно стало, вот и начал эксперимент. Задача вычисления быстрого вычисления числа в натуральной степени. Вот пара решений на C++:
Код:
Код:
Код:
Цикл ~327.317 мСек Но насколько я понимаю, в рекурсии используется концевая рекурсия и компилятор мог бы допереть до этого и сделать очень мощную оптимизацию, которая бы обошла "обычный" способ. И еще, есть ли еще способы, не прибегая к асму, оптимизировать оба метода? |
11.12.2012, 09:23 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,069
|
Это не хвостовая рекурсия, т.к. два разных рекурсивных вызова может быть.
|
11.12.2012, 09:36 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Продлите експеримент дальше - сделайте стек у вашего приложения 4КБ и дерзайте с рекурсией....
|
11.12.2012, 09:42 | #4 | |||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Цитата:
Цитата:
WTF o_O. Теперь появилась потребность выразить быстрое возведение в натуральную степень с хвостовой рекурсией. Хм, и как? Есть идеи или это невозможно? Цитата:
Последний раз редактировалось Kostia; 11.12.2012 в 09:53. |
|||
11.12.2012, 09:43 | #5 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Код:
Код:
Код:
Последний раз редактировалось Abstraction; 11.12.2012 в 09:59. |
|
11.12.2012, 09:45 | #6 | |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
|
|
11.12.2012, 10:23 | #7 | |||
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Цитата:
Цитата:
вообще раньше был __uint8_t, но потом все превратилось в 64 бита Ok. Ваши варианты уравняли производительность. Еще для меня стало непонятным то, что если в рекурсии передавать значения по ссылке, то скорость резко падает, почему? Как-то так на haskell перевел: Код:
Код:
Цитата:
Последний раз редактировалось Kostia; 11.12.2012 в 11:08. |
|||
11.12.2012, 11:08 | #8 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,069
|
Хотя да. Пожалуй всё же там хвостовая рекурсия. Просто такую конструкцию проблематично оптимизатору развернуть, т.к. там условный вызов идёт, а условия имеют привычку предсказываться и выполняться наперёд.
|
11.12.2012, 11:23 | #9 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
есть еще такой вариант и он работает быстрее, вполне возможно что это из-за лишнего вызова функции?
Код:
|
11.12.2012, 11:31 | #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 |