我刚刚开始学习球拍,我需要创建一个随机合并两个列表的过程。
这是我的代码:
#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
。
如何获取要获取的列表?
答案 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您的右括号不是惯用的。