На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Этот ... LISP , Проблема
      Народ!!! Я вижу тут много умников по лиспу собралось. Не могли бы вы помочь начинающему лисперу решить задачку. В последующем смогу присоединиться и пополнить ряды лисперов по обмену опытом!!!
      :wall: Задача: Написать функцию, генерирующую все циклические перестановки списка.

      Пусть элементами множества являются списки. Написать функцию, генерирующую все перестановки этого множества с учетом перестановок внутренних списков, т.е. перестановки множества
      ((A B)(C D)) - это (((A B)(C D)) ((B A)(C D)) ((A B)(D C)) ((B A)(D C)) ((C D)(A B)) ((D C)(A B)) ((C D)(B A)) ((D C)(B A))). И все в таком духе. Буду Очень Признателен!!!

      П. С. На худой конец, Если очень ломает, идею или ресурсы обучалок подскажите.
        Цитата

        Написать функцию, генерирующую все циклические перестановки списка.

        ExpandedWrap disabled
          (defun rotate-list (list)
            (if (null list)
                nil
                (append (cdr list) (list (car list)))))
           
          (defun all-rotations (list)
            (if (null list)
                (list list)
                (loop for x in list
                      for y = list then (rotate-list y)
                      collect y)))


        Цитата

        Написать функцию, генерирующую все перестановки этого множества с учетом перестановок внутренних списков


        ExpandedWrap disabled
          (defun all-permutations (list)
            (if (atom list)
                (list list)
                (loop for (x . tail) on list
                      and head = nil then (cons x head)
                      append (mapcar (lambda (y) (cons x y)) (all-permutations (append head tail))))))
           
          (defun all-deep-permutations (mlist)
            (if (atom mlist)
                (list mlist)
                (mapcan #'all-embedded-permutations (all-permutations mlist))))
           
          (defun all-embedded-permutations (mlist)
            (if (atom mlist)
                (list mlist)
                (map-descartes-product #'cons
                                       (all-deep-permutations (car mlist))
                                       (all-embedded-permutations (cdr mlist)))))
           
          (defun map-descartes-product (f xs ys)
            (mapcan (lambda (x) (mapcar (lambda (y) (funcall f x y)) ys)) xs))
          ;;; (all-deep-permutations '((a b) (c d)))


        Цитата

        ресурсы обучалок подскажите

        http://www.cliki.net/index/Online%20Tutorial
          Цитата

          Народ!!! Я вижу тут много умников по лиспу собралось. Не могли бы вы помочь начинающему лисперу решить задачку. В последующем смогу присоединиться и пополнить ряды лисперов по обмену опытом!!!
          :wall: Задача: Написать функцию, генерирующую все циклические перестановки списка.

          Пусть элементами множества являются списки. Написать функцию, генерирующую все перестановки этого множества с учетом перестановок внутренних списков, т.е. перестановки множества
          ((A B)(C D)) - это (((A B)(C D)) ((B A)(C D)) ((A B)(D C)) ((B A)(D C)) ((C D)(A B)) ((D C)(A B)) ((C D)(B A)) ((D C)(B A))). И все в таком духе. Буду Очень Признателен!!!

          П. С. На худой конец, Если очень ломает, идею или ресурсы обучалок подскажите.


          PS: На худой конец вот сюда жмакай.

          http://www.progz.ru/forum/viewforum.php?f=10&sid=d3d8db3537fb3af04db373db48894595
            Alexey Dejneka!!!
            ;) Я очнь рад, что ты отозвался, но мою задачу надо решить без единого гвоздика, т. е. рекурсивно...
            Я то так и сам понял в чем фишка. А вот с рекурсией геморой... Нельзя ли чуток переделать? :whistle: В любом случае спасибо... Надеюсь смогу отплатить той же монетой. Я только учусь, но могу помочь по C/C++, Pascal, Java.
              попробуй вот так:

              ExpandedWrap disabled
                (defun fold-right (op initial sequence)
                  "Folds `sequence' with `op' right-to-left with `initial' operand."
                  (if (null sequence)
                      initial
                    (funcall op (car sequence)
                         (fold-right op initial (cdr sequence)))))
                 
                (defun flat (x)
                  "Flats '((x1 x2) (x3 x4)) to '(x1 x2 x3 x4)."
                  (fold-right #'append '() x))
                 
                (defun cyclic-permutations (xlist)
                  "Do a '(x1 x2 x3) => '((x1 x2 x3) (x3 x1 x2) (x2 x3 x1)) stuff."
                  (labels ((cycle (left right result)
                                  (if (null right) result
                                    (let ((left2 (append left (list (car right))))
                                          (right2 (cdr right)))
                                      (cycle left2 right2 (cons (append right2 left2)
                                                                result))))))
                    (cycle nil xlist nil)))
                 
                (defun deep-cyclic-perms (xlist)
                  (if (null xlist) (list nil)
                    (flat (mapcar (lambda (permut)
                                    (cyclic-permutations permut))
                            (flat (mapcar (lambda (cdr-perm)
                                            (if (listp (car xlist))
                                                (mapcar (lambda (car-perm)
                                                          (cons car-perm
                                                                cdr-perm))
                                                  (deep-cyclic-perms (car xlist)))
                                              (list (cons (car xlist) cdr-perm))))
                                    (deep-cyclic-perms (cdr xlist))))))))



              Цитата Platon @
              Надеюсь смогу отплатить той же монетой.


              может, зарегистрироваться для начала? ;)


              Цитата Platon @
              Я очнь рад, что ты отозвался, но мою задачу надо решить без единого гвоздика, т. е. рекурсивно...


              цикл представляем хвостовой рекурсией, так что нормально решение, вроде.
                uj!!! :D
                Большой Dankeschon!!! Очень признателен!!!! Уже зарегался!!! Только не знаю как это мне и вам поможет ;)
                Рейтинг поднял!!! В любом случае всем спасибо за участие Пишите может пригожусь!!!
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0237 ]   [ 14 queries used ]   [ Generated: 19.05.24, 05:22 GMT ]