Я наткнулся на этот вопрос, когда искал "СХЕМА LISP КРУГЛЫХ СПИСКОВ".
Вот как я могу сделать один (в схеме STk):
Сначала составьте список
(define a '(1 2 3))
На данный момент STk считает a списком.
(list? a)
> #t
Затем перейдите к последнему элементу (в данном случае 3
) и замените cdr
, который в настоящее время содержит nil
, указателем на себя.
(set-cdr! (cdr ( cdr a)) a)
Теперь STk считает, что это не список.
(list? a)
> #f
(Как это получается?)
Теперь, если вы напечатаете a
, вы найдете бесконечно длинный список (1 2 3 1 2 3 1 2 ...
и вам нужно будет убить программу. В Stk вы можете control-z
или control-\
, чтобы выйти.
Но для чего нужны круглые списки?
Я могу вспомнить неясные примеры, связанные с арифметикой по модулю, такие как круговой список дней недели (M T W T F S S M T W ...)
или круговой список целых чисел, представленных 3 битами (0 1 2 3 4 5 6 7 0 1 2 3 4 5 ..)
.
Есть ли примеры из реальной жизни?