Слияние двух списков случайным образом возвращает странный объединенный список - PullRequest
0 голосов
/ 28 октября 2018

Я только начал изучать Ракет, и мне нужно создать процедуру, которая объединяет два списка случайным образом.

Это мой код:

#lang racket
(define merge-randomly
   (lambda (lst1 lst2)
      (cond ((and (null? lst1) (null? lst2)) null)
            ((null? lst1) lst2)
            ((null? lst2) lst1)
            (else
               (cond ((> (random) 0.5) (cons (cons (car lst1) (car lst2)) (merge-randomly (cdr lst1) (cdr lst2))))
                     (else (cons (cons (car lst2) (car lst1)) (merge-randomly (cdr lst1) (cdr lst2))))
               )
            )
      )
   )
)

Мне нужно использовать со списком, как эти два:

(define l1 '((1 2 3) (7 8 9)))
(define l2 '((4 5 6)))

Мне нужно создать новый список, подобный этому:

'((4 5 6) (1 2 3) (7 8 9))

Но я получаю этот список:

'(((4 5 6) 1 2 3) (7 8 9))

Я делаю что-то не так, возможно, здесь, (cons (cons (car lst1) (car lst2)), или здесь, (cons (cons (car lst2) (car lst1)), по инструкции else в первом cond.

Как я могу получить список, который я хочу получить?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Ваше предположение верно.Формат для cons следующий:

(cons first-element rest-of-the-list)

Итак, когда вы используете (const '(4 5 6) '(1 2 3)), он возвращает ((4 5 6) 1 2 3).

Правильный формат того, что вы пытаетесь сделать, будетбыть:

(cons (car lst1) (cons (car ls2) (merge-randomly (cdr lst1) (cdr lst2))))

и аналогично для второго случая.

Вот как должна выглядеть финальная функция:

(define merge-randomly
   (lambda (lst1 lst2)
      (cond ((and (null? lst1) (null? lst2)) null)
            ((null? lst1) lst2)
            ((null? lst2) lst1)
            (else
               (cond ((> (random) 0.5) (cons (car lst1) (cons (car lst2) (merge-randomly (cdr lst1) (cdr lst2)))))
                     (else (cons (car lst2) (cons (car lst1) (merge-randomly (cdr lst1) (cdr lst2)))))
               )
            )
      )
   )
)
0 голосов
/ 28 октября 2018

Проблема с (cons (cons (car lst1) (car lst2)) ...).Измените его на (cons (car lst1) (cons (car lst2) ...).

PS Ваши закрывающие скобки не имеют идиоматического значения.

...