Взятие групп элементов случайным образом в схеме - PullRequest
0 голосов
/ 17 ноября 2018

Как мне реализовать программу на Схеме, берущую элементы заданного списка и возвращающую новый список, где элементы являются случайными наборами предыдущего списка?Я хотел бы, чтобы это работало для любой длины.Например:

Ввод: '(a e i o u), вывод: '((a e) (i o) (u)) для длины 2.

Мои попытки (с использованием for / list) неуклюжи и основаны на рекурсии.Я разделил задачи в соответствии с предложением arscar:

  1. Выберите n элементов случайным образом из списка l:

    (define (pick-n-random l n)
      (take (shuffle l) n))
    
  2. Удалить список l2из списка l1:

    (define (cut l1 l2)
      (cond ((null? l1)
             '())
            ((not (member (car l1) l2))
             (cons (car l1) (cut (cdr l1) l2)))
            (else
             (cut (cdr l1) l2))))
    

Тогда, и это моя проблема: как мне пройти через этот процесс, чтобы получить намеченную программу?Должен ли я использовать for/list для вставки всех подсписков, полученных этим процессом 1. и 2.?

1 Ответ

0 голосов
/ 17 ноября 2018

Будет проще, если мы разделим проблему на куски.Во-первых, давайте напишем пару процедур, которые позволят нам брать или удалять n элементы из списка, с соответствующими результатами, если в списке недостаточно элементов (если бы не это, мы могли бы использовать встроенныев take и drop):

(define (take-up-to lst n)
  (if (or (<= n 0) (null? lst))
      '()
      (cons (car lst) (take-up-to (cdr lst) (sub1 n)))))

(define (drop-up-to lst n)
  (if (or (<= n 0) (null? lst))
      lst
      (drop-up-to (cdr lst) (sub1 n))))

Имея две вышеуказанные процедуры, можно легко создать другую процедуру для группировки элементов в списке в подсписки n-размера:

(define (group lst n)
  (if (null? lst)
      '()
      (cons (take-up-to lst n)
            (group (drop-up-to lst n) n))))

Наконец, мы объединяем нашу процедуру группировки с shuffle, который рандомизирует содержимое списка:

(define (random-groups lst n)
  (group (shuffle lst) n))

Работает, как и ожидалось:

(random-groups '(a e i o u) 2)
=> '((e a) (u i) (o))
...