рСкурсия -- ΠΌΠΎΠΆΠ½ΠΎ быстрСС?

18 views
Skip to first unread message

nsk.coder

unread,
Oct 7, 2010, 12:59:42β€―AM10/7/10
to SPb Haskell User Group
Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь!
Полагаю, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΊΡ‚ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ Π² рСкурсивном стилС, задумываСтся ΠΎΠ±
эффСктивности.

НСдавно, Π½Π° Ρ‚Π°ΠΊΠΎΠΌ простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ вычислСния чисСл Π€ΠΈΠ±Π±ΠΎΠ½Π°Ρ‡ΠΈ
споткнулся ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹Π΅ Ρ‚ΠΎΡ€ΠΌΠΎΠ·Π°:

fib 1 = 1
fib 2 = 1
fib n = fib (n-1) + fib (n-2)

Π£ΠΆΠ΅ ΠΏΡ€ΠΈ n=35 это Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΠΏΡ€ΠΈ n=40 -- двухядСрный Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ
ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ висит ΡƒΠΆΠ΅ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹.

МоТно Π»ΠΈ процСсс ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ? НавСрняка это достаточно популярная Ρ‚Π΅ΠΌΠ°,
особСнно ΠΈΠ·Π±ΠΈΡ‚Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с числами Π€ΠΈΠ±Π±ΠΎΠ½Π°Ρ‡ΠΈ. Π’Π΅Π΄ΡŒ аналогичная Π·Π°Π΄Π°Ρ‡Π° Π²
ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, оформлСнная Π² Π²ΠΈΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° считаСтся
ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ для ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… n!!

Eugene Kirpichov

unread,
Oct 7, 2010, 1:06:21β€―AM10/7/10
to spb...@googlegroups.com
7 октября 2010Β Π³. 8:59 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ nsk.coder <nsk....@gmail.com> написал:
Ну ясСн Ρ…Ρ€Π΅Π½: сортировка ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ Π½Π° си дСлаСтся
нСсколько ΠΌΠΈΠ½ΡƒΡ‚, Π° radix sort Π½Π° ruby справляСтся Π·Π° долю сСкунды -
сСнсация, динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ языки ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»ΠΈ
статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ ΡΡ‚Π°Ρ€ΡŒΠ΅!!111

Π’ΡƒΡ‚ Π΄Π΅Π»ΠΎ Π½Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ языка ΠΈ Π½Π΅ Π² Ρ†ΠΈΠΊΠ»Π°Ρ… ΠΏΡ€ΠΎΡ‚ΠΈΠ² рСкурсии, Π°
Π² Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ вычислСния. Как Π½Π°
ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ языкС ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСэффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Ρ‚Π°ΠΊ ΠΈ Π½Π°
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ - эффСктивный.

Π’ΠΎΡ‚ эта вСрсия Π±ΡƒΠ΄Π΅Ρ‚ быстро Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ…ΠΎΡ‚ΡŒ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π½ΠΎΠ΅ число Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ.

fib :: Int -> Int
fib = fst . fib2

fib2 :: Int -> (Int, Int)
fib2 0 = (1, 1)
fib2 1 = (1, 2)
fib2 n
| even n = c `seq` (a*a + b*b, c*c - a*a)
| otherwise = c `seq` (c*c - a*a, b*b + c*c)
where (a,b) = fib2 (n `div` 2 - 1)
c = a + b

>
> --
> ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС Π² SPb HUG: spb...@googlegroups.com
> ΠžΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ подписку: spbhug-un...@googlegroups.com
> Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π³Ρ€ΡƒΠΏΠΏΡ‹: http://groups.google.com/group/spbhug?hl=ru

--
Eugene Kirpichov
Senior Software Engineer,
Grid Dynamics http://www.griddynamics.com/

nsk.coder

unread,
Oct 7, 2010, 4:36:37β€―AM10/7/10
to SPb Haskell User Group
Бпасибо!!

Π’Π΅Π»ΠΈΠΊΠΈΠΉ Π“ΡƒΠ³Π» (ΠΏΡ€Π°Π²Π΄Π° Π½Π° нСлюбимом английском) Π΄Π°Π» Π΅Ρ‰Π΅ нСсколько
подходящих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠΆ ΠΊΠΎΠΌΡƒ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсно:

http://www.cubbi.org/serious/fibonacci/haskell.html
http://www.haskell.org/haskellwiki/The_Fibonacci_sequence
http://en.literateprograms.org/Fibonacci_numbers_(Haskell)

Π’ΠΎΠ³Π΄Π°, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π·Π°Π΄Π°Ρ‚ΡŒ вопрос слСдовало ΠΈΠ½Π°Ρ‡Π΅:

Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ рСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ быстрыми ΠΈ Π³Π΄Π΅ ΠΎΠ± этом
ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ?
(Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΎ "Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ" ΠΈ ΠΌΠΎΠΆΠ½ΠΎ
Π»ΠΈ Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² этом случаС)

ΠžΡ‚Π²Π΅Ρ‚ Ρ‚ΠΈΠΏΠ° "Ρ€ΡƒΠΊΠΈ ΠΊΡ€ΠΈΠ²Ρ‹Π΅" ΠΊΠ°ΠΊ-Ρ‚ΠΎ грустно Π·Π²ΡƒΡ‡ΠΈΡ‚ :(


On 7 ΠΎΠΊΡ‚, 12:06, Eugene Kirpichov <ekirpic...@gmail.com> wrote:
> 7 октября 2010Β Π³. 8:59 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ nsk.coder <nsk.co...@gmail.com> написал:

Eugene Kirpichov

unread,
Oct 7, 2010, 4:40:09β€―AM10/7/10
to spb...@googlegroups.com
7 октября 2010Β Π³. 12:36 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ nsk.coder <nsk....@gmail.com> написал:

> Бпасибо!!
>
> Π’Π΅Π»ΠΈΠΊΠΈΠΉ Π“ΡƒΠ³Π» (ΠΏΡ€Π°Π²Π΄Π° Π½Π° нСлюбимом английском) Π΄Π°Π» Π΅Ρ‰Π΅ нСсколько
> подходящих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠΆ ΠΊΠΎΠΌΡƒ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсно:
>
> http://www.cubbi.org/serious/fibonacci/haskell.html
> http://www.haskell.org/haskellwiki/The_Fibonacci_sequence
> http://en.literateprograms.org/Fibonacci_numbers_(Haskell)
>
> Π’ΠΎΠ³Π΄Π°, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π·Π°Π΄Π°Ρ‚ΡŒ вопрос слСдовало ΠΈΠ½Π°Ρ‡Π΅:
>
> Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ рСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ быстрыми ΠΈ Π³Π΄Π΅ ΠΎΠ± этом
> ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ?
Π’ΠΈΠ΄ΠΈΠΌΠΎ, имССтся Π² Π²ΠΈΠ΄Ρƒ "Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ прСобразования
рСкурсивных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅, избавлСния ΠΎΡ‚ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ
рСкурсии ΠΈΡ‚ΠΏ"?
Π•ΡΡ‚ΡŒ.

Π‘ΠΌ. Π½Π°ΠΏΡ€. http://fprog.ru/2009/issue3/ , ΡΡ‚Π°Ρ‚ΡŒΡ "Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹
Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков", Π³Π»Π°Π²Π° "Π₯востовой Π²Ρ‹Π·ΠΎΠ²".

> (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΎ "Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ" ΠΈ ΠΌΠΎΠΆΠ½ΠΎ
> Π»ΠΈ Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² этом случаС)

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с Ρ„ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ Π½Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ рСкурсия Π½Π΅ хвостовая, Π°
Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° дрСвовидная ΠΈ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ - ΠΊΡƒΡ‡Π° всСго лишний Ρ€Π°Π·
пСрСсчитываСтся. Π­Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ явлСнию
рСкурсии ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ, просто использован Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

Dmitry Olshansky

unread,
Oct 7, 2010, 5:56:30β€―AM10/7/10
to spb...@googlegroups.com
Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ:
Β 
Β 
ΠΈ Ρ‚.Π΄.

7 октября 2010Β Π³. 12:40 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Eugene Kirpichov <ekirp...@gmail.com> написал:

Roman Cheplyaka

unread,
Oct 7, 2010, 4:43:30β€―PM10/7/10
to spb...@googlegroups.com
По Π·Π°Π±Π°Π²Π½ΠΎΠΌΡƒ совпадСнию ΠΊΠ°ΠΊ Ρ€Π°Π· сСгодня Π² -cafe ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΈΡΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅
аспСкты ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ.

http://www.haskell.org/pipermail/haskell-cafe/2010-October/084528.html ΠΈ
дальшС ΠΏΠΎ Ρ‚Ρ€Π΅Π΄Ρƒ.

* Dmitry Olshansky <olsha...@gmail.com> [2010-10-07 13:56:30+0400]

--
Roman I. Cheplyaka :: http://ro-che.info/
"Don't let school get in the way of your education." - Mark Twain

Reply all
Reply to author
Forward
0 new messages