合并两个列表随机返回一个奇怪的合并列表

时间:2018-10-28 07:26:10

标签: list scheme racket

我刚刚开始学习球拍,我需要创建一个随机合并两个列表的过程。

这是我的代码:

#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))开头的else指令中,在(cons (cons (car lst2) (car lst1))或此处,cond

如何获取要获取的列表?

2 个答案:

答案 0 :(得分:1)

您的猜测是正确的。 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)))))
               )
            )
      )
   )
)

答案 1 :(得分:0)

问题出在(cons (cons (car lst1) (car lst2)) ...)上。将其更改为(cons (car lst1) (cons (car lst2) ...)

PS您的右括号不是惯用的。