powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Реверт очереди за линейное время
18 сообщений из 43, страница 2 из 2
Реверт очереди за линейное время
    #36894710
umniaxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В предыдущем посту опечатался: foldr имеет 3 параметра fun, res, args - fun - функция, которая применяется на каждом шаге, res - результат после очередного шага, args - список, которые на вход
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36894849
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёлки зелёные, так при чём жеж тут "очередь"? Да и foldr -- это самая что ни на есть рекурсия.

Это классическая задачка для будущих кулхацкеллов.

Код: plaintext
reverse = ($ []) . (foldr (((\f x y -> f y x) (.)) . (:)) (\x -> x))
Код: plaintext
1.
2.
Hugs> let reverse = ($ []) . (foldr (((\f x y -> f y x) (.)) . (:)) (\x -> x)) in reverse [ 1 , 2 , 3 , 4 ]
[ 4 , 3 , 2 , 1 ]
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36895038
umniaxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит я перемудрил с тем, чтобы попонятнее написать) очень прошу извинить
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36895057
umniaxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно еще вопрос: что за язык реализации? И где источник, в котором можно черпать такие задачки?
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36895106
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Haskell, вестимо. Конкретнее -- WinHugs.
Источник именно такого рода задачек не подскажу, к сожалению; сам нахватываюсь по мелочи и по случаю, то тут то там, но вообще больше алгоритмическими задачами интересуюсь.
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36895153
umniaxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
junior idiot,

Спасибо большое))
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36895945
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umniaxaБолее подробно: на вход подается список, [1,2,3,4] например. На выходе должно получится [4,3,2,1]
Любой язык программирования к реализованной структурой данных типа "стек" или "дек".
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36896484
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umniaxaПолностью условие звучит так: Используя только операцию foldr и лямбда выражения ревертнуть список не использую рекурсивных функций за линейное время

foldr f arg работает приблизительно так:
foldr (+) 0 [1,2,3,4] = ((((0+4)+3)+2)+1)
Ну раз уж пошла такая пьянка:

Немного CL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
>(defun reverse-list (l)
    (declare (list l))
    (reduce #'(lambda (x y) (cons y x)) l :initial-value '())
    )

REVERSE-LIST

>(reverse-list '( 1   2   3   4 ))

( 4   3   2   1 )

>
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36896543
umniaxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините за еще один тупой вопрос, но не могли бы вы пояснить еще один момент:
что значит эта часть вашего примера:
Код: plaintext
($ []) .
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36896766
junior  idiot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mozokreduce
Есть мнение, что reduce -- это fold l , а не fold r .
Если допустить использование foldl, то задача становится совсем по-детски тривиальной:
Код: plaintext
1.
Hugs> foldl (\x y -> y:x) [] [ 1 , 2 , 3 , 4 ]
[ 4 , 3 , 2 , 1 ]

Частично предположение об аналогии с foldl подтверждается исходниками clisp 2.48.
clisp-2.48/src/sequence.d
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
/*
...
UPD           (lambda (seq pointer) ...) -> pointer
              returns a pointer to the adjacent neighbor at the right.
              SEQ-UPD can assume, that the right border of
              SEQ is not stepped over.
...
INIT-START    (lambda (seq index) ...) -> pointer
              returns a pointer which moves in SEQ from left to right
              from Position index. Must execute the Range-test by itself.
...
*/
...
LISPFUN(reduce,seclass_default, 2 , 0 ,norest,key, 5 ,
        (kw(from_end),kw(start),kw(end),kw(key),kw(initial_value)) )
{ /* (REDUCE function sequence [:from-end] [:start] [:end] [:key]
             [:initial-value]), CLTL p. 251, CLTL2 p. 397
  Stack layout: function, sequence, from-end, start, end, key, initial-value. */
...
    /* Stack layout: function, seq, from-end, start, end, key, initial-value,
                     typdescr, count, pointer, value. */
    do {
      /* Calculate next value: */
      pushSTACK(STACK_( 5 + 4 )); pushSTACK(STACK_( 1 + 1 ));
      funcall(seq_access(STACK_( 3 + 2 )), 2 ); /* (SEQ-ACCESS seq pointer) */
      funcall_key(STACK_( 1 + 4 ),value1); /* (FUNCALL key (SEQ-ACCESS seq pointer)) */
      pushSTACK(STACK_0); pushSTACK(value1);
      funcall(STACK_( 6 + 4 + 2 ), 2 ); /* (FUNCALL fun value (FUNCALL key (SEQ-ACCESS seq pointer))) */
      STACK_0 = value1; /* =: value */
      into_fromstart_loop:
      /* Advance pointer: */
      pointer_update(STACK_1,STACK_( 5 + 4 ),STACK_3);
      /* count := (1- count) : */
      decrement(STACK_2);
    } while (!eq(STACK_2,Fixnum_0)); /* count (an integer) = 0 ? */
    VALUES1(popSTACK()); /* return value */
    skipSTACK( 7 + 3 );
  }
}

"Частично" -- потому что тут цикл, а не рекурсия. В Prelude.hs же определение foldl явно рекурсивно:
Prelude.hs
Код: plaintext
1.
2.
foldl            :: (a -> b -> a) -> a -> [b] -> a
foldl f z []      = z
foldl f z (x:xs)  = foldl f (f z x) xs

хотя, конечно, будучи хвостовым, соптимизируется в цикл, но всё же.

umniaxa, операторы (двуместные функции) ($) и (.) определены в Prelude.hs:
Prelude.hs
Код: plaintext
1.
2.
3.
4.
5.
($)            :: (a -> b) -> a -> b
f $ x           = f x
...
(.)            :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) x       = f (g x)

Это аппликация и композиция соответственно.
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36896802
umniaxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36897348
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior idiot
Есть мнение, что reduce -- это fold l , а не fold r .

Согласен, забыл про волшебный флажок :)
Еще немного CL
Код: plaintext
(reduce #'(lambda (x y) (nconc y (list x))) l :from-end t :initial-value '())
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #36898039
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior idiot
Формально -- нет.
Комбинатор неподвижной точки как раз и нужен для того, чтобы рекурсивное определение преобразовать в не рекурсивное.
дело не в определении, а в вычислительном процессе, порождаемом функцией
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Реверт очереди за линейное время
    #37982843
erwert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rev l = foldr (\f a b -> a (f:b)) id l []
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #37994757
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erwert,
ага... Я ещё тогда забыл напомнить по поводу
maytonЛюбой язык программирования к реализованной структурой данных типа "стек" или "дек".Например, на любом Forth в реализации 83 и выше:
Код: sql
1.
2.
3.
4.
5.
: REVERT DEPTH DUP 0> IF 0 DO . LOOP ELSE DROP THEN ;
>Ok
1 2 3 4 REVERSE
4 3 2 1
>Ok
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #37994758
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* Да уж... REVERSE - это только что определенный REVERT, и должен именно так и писАться., как revert ...
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #37994766
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С новым годом...
...
Рейтинг: 0 / 0
Реверт очереди за линейное время
    #37994783
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonС новым годом...Да видел я, видел
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Реверт очереди за линейное время
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]