Алгоритм перестановки с использованием хвостовой рекурсии?
От: avpavlov  
Дата: 12.02.09 15:30
Оценка:
Не силён я в сферических алгоритмах, так что не знаю, существует ли такой? Своим умом допёр только до обычного рекурсивного

def permutations[T](list:List[T]):List[List[T]] = list match {
  case List() => List()
  сase List(a) => List(List(a))
  case _ => list.flatMap(item => permutations(list.filter(_ != item)).map(permutation => item :: permutation))
}

println(permutations(List(1,2,3,4)).mkString("\n"))


Киньте ссылку, где почитать
Re: Алгоритм перестановки с использованием хвостовой рекурси
От: Sergej Pupykin  
Дата: 12.02.09 16:59
Оценка:
На хаскеле

subs :: [a] -> [a]]
subs [] = []]
subs (x:xs) = yss ++ map (x yss
where yss = subs xs

interleave :: a -> [a] -> [a]]
interleave x [] = [x]]
interleave x (y:ys) = (x:y:ys) : map (y (interleave x ys)

perms :: [a] -> [a]]
perms [] = []]
perms (x:xs) = concat (map (interleave x) (perms xs))

На ерланге

perms([]) -> [ [] ];
perms(List) -> [ [Head | Tail] || Head <- List, Tail <- perms(List--[Head]) ].

http://blogs.claritycon.com/blogs/peter_miller/archive/2007/10/10/3307.aspx

12-02-2009, avpavlov <12804@users.rsdn.ru> пишет:
>
> Не силён я в сферических алгоритмах, так что не знаю, существует ли такой? Своим умом допёр только до обычного рекурсивного
>
>
> def permutations[T](list:List[T]):List[List[T]] = list match {
>   case List() => List()
>   сase List(a) => List(List(a))
>   case _ => list.flatMap(item => permutations(list.filter(_ != item)).map(permutation => item :: permutation))
> }
>
> println(permutations(List(1,2,3,4)).mkString("\n"))
>

>
> Киньте ссылку, где почитать
Posted via RSDN NNTP Server 2.1 beta
Re: Алгоритм перестановки с использованием хвостовой рекурси
От: thesz Россия http://thesz.livejournal.com
Дата: 12.02.09 17:09
Оценка:
A>Не силён я в сферических алгоритмах, так что не знаю, существует ли такой? Своим умом допёр только до обычного рекурсивного

Можно, в принципе. Только стек придётся эмулировать самостоятельно и таскать в качестве параметра.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re: Алгоритм перестановки с использованием хвостовой рекурси
От: palm mute  
Дата: 12.02.09 18:13
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Киньте ссылку, где почитать

В стандартной библиотеке C++ есть функция next_permutation. Добрые люди говорят, что использует она некий algorithm L, придуманный Кнутом.
Re: Алгоритм перестановки с использованием хвостовой рекурси
От: Mr.Cat  
Дата: 12.02.09 19:25
Оценка: 10 (1)
Здравствуйте, avpavlov, Вы писали:
A>Не силён я в сферических алгоритмах, так что не знаю, существует ли такой? Своим умом допёр только до обычного рекурсивного.

В принципе можно написать как угодно, а потом прогнать через CPS-трансформер.
Re[2]: Алгоритм перестановки с использованием хвостовой реку
От: avpavlov  
Дата: 13.02.09 09:03
Оценка:
SP>perms :: [a] -> [a]]
SP>perms [] = []]
SP>perms (x:xs) = concat (map (interleave x) (perms xs))

А где здесь хвостовая рекурсия?

SP>perms([]) -> [ [] ];

SP>perms(List) -> [ [Head | Tail] || Head <- List, Tail <- perms(List--[Head]) ].

Синтаксис Эрланга мне не совсем понятен, но хвостовая рекурсия тут тоже не слишком очевидна. Или Эрланг всё таки достаточно умён, и преобразует в хвостовую рекурсию?
Re[2]: Алгоритм перестановки с использованием хвостовой реку
От: avpavlov  
Дата: 13.02.09 09:04
Оценка:
Здравствуйте, thesz, Вы писали:

A>>Не силён я в сферических алгоритмах, так что не знаю, существует ли такой? Своим умом допёр только до обычного рекурсивного


T>Можно, в принципе. Только стек придётся эмулировать самостоятельно и таскать в качестве параметра.


Да, я такой вариант рассматривал, только жертвовать читаемостью ради хвостовой рекурсии не хочется
Re[2]: Алгоритм перестановки с использованием хвостовой реку
От: avpavlov  
Дата: 13.02.09 09:05
Оценка:
Здравствуйте, palm mute, Вы писали:

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


A>>Киньте ссылку, где почитать

PM>В стандартной библиотеке C++ есть функция next_permutation. Добрые люди говорят, что использует она некий algorithm L, придуманный Кнутом.

В википедии есть алгоритм вообще без рекурсии, но выглядит он как чёрная магия. Я всё-таки голосую за легкочитаемость кода

http://en.wikipedia.org/wiki/Permutation
Re[2]: Алгоритм перестановки с использованием хвостовой реку
От: avpavlov  
Дата: 13.02.09 09:13
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

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

A>>Не силён я в сферических алгоритмах, так что не знаю, существует ли такой? Своим умом допёр только до обычного рекурсивного.

MC>В принципе можно написать как угодно, а потом прогнать через CPS-трансформер.


Спасибо!

В действительности идея CPS довольно простая, будет время посижу подумаю как переписать в CPS стиле без трансформера (для самообразования )
Re[3]: Алгоритм перестановки с использованием хвостовой реку
От: Sergej Pupykin  
Дата: 13.02.09 16:23
Оценка:
13-02-2009, avpavlov <12804@users.rsdn.ru> пишет:
>
> SP>perms :: [a] -> [a]]
> SP>perms [] = []]
> SP>perms (x:xs) = concat (map (interleave x) (perms xs))
>
> А где здесь хвостовая рекурсия?
>
> SP>perms([]) -> [ [] ];
> SP>perms(List) -> [ [Head | Tail] || Head <- List, Tail <- perms(List--[Head]) ].
>
> Синтаксис Эрланга мне не совсем понятен, но хвостовая рекурсия тут тоже не слишком очевидна. Или Эрланг всё таки достаточно умён, и преобразует в хвостовую рекурсию?
>

Да эт я облажался
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.