0

我有这个函数来创建一个列表,其中初始元素来自另一个问题列表,初始元素在 Lisp 中从 99 开始到 0

(defun newList (&optional(n 100))
  (loop for i from (- n 1) downto 0 collect i))

(defun board (newList &optional(n 10))
  (cond
   ((null newList) nil)
   (t (cons (subseq newList 0 n) (board (subseq newList n) n)))))

(defun show-board (board)
    (format T "~%")
    (mapcar (lambda (x) (format T " ~A ~%" x)) board)
    (format nil "")
)

(show-board (board (newList)))

(99 98 97 96 95 94 93 92 91 90) 
(89 88 87 86 85 84 83 82 81 80) 
(79 78 77 76 75 74 73 72 71 70) 
(69 68 67 66 65 64 63 62 61 60) 
(59 58 57 56 55 54 53 52 51 50) 
(49 48 47 46 45 44 43 42 41 40) 
(39 38 37 36 35 34 33 32 31 30) 
(29 28 27 26 25 24 23 22 21 20) 
(19 18 17 16 15 14 13 12 11 10) 
(9 8 7 6 5 4 3 2 1 0) 

在此处查看结果https://ideone.com/Paorct 并使用此功能删除重复号码

(defun remove-duplicate (pred l)
  (cond ((null l) NIL) 
        ((funcall pred (car l)) (remove-duplicate pred (cdr l)))
        (T (cons (car l) (remove-duplicate pred (cdr l))))))

我想实现一个接收列表并随机更改其数字的函数。创建一个递归函数并使用

第n个

函数、随机函数和

删除重复

函数,该函数必须从列表中删除等于随机找到的数字的数字。

停止条件是列表为空;

应该使用

使用以下语句在本地存储在随机位置找到的数字的语句:

(nth (随机 (长度 l)) l)

使用

删除重复

您应该从作为递归函数中的参数传递的列表中删除随机找到并存储在本地的数字。我有这个,但它不起作用,我试图理解算法

我的疑问就在这里,如何实现无重复数字的随机列表功能

(defun shuffle-list (l)
   ;; iterate 99 times
   (dotimes (i (- (length l) 1))
    ;; store random number to n
    (let ((n (nth (random (length l)) l)))
         ;; print value of n
         (format t "~A ~%" n)
         (cond 
             ((null l) nil)
             ;; I have this but it´s not show the new list
             (t (remove-duplicate #'(lambda (x) (= x n)) l))))))

例如,结果应该是

 (94 25 54 89 21 8 36 14 41 96) 
 (78 47 56 23 5 49 13 12 26 60)  
 (0 27 17 83 34 93 74 52 45 80)  
 (69 9 77 95 55 39 91 73 57 30) 
 (24 15 22 86 1 11 68 79 76 72)  
 (81 48 32 2 64 16 50 37 29 71)  
 (99 51 6 18 53 28 7 63 10 88)  
 (59 42 46 85 90 75 87 43 20 31)  
 (3 61 58 44 65 82 19 4 35 62)
 (33 70 84 40 66 38 92 67 98 97)
4

2 回答 2

1

remove-duplicate定义采用谓词并删除谓词为真的元素。它的行为与内置的remove-if相同。

因此,您必须创建一个谓词函数,将列表项与n保存在(let ((n (nth (random (length list)) list))). 了解变量、lambda 和闭包

于 2019-11-30T16:00:31.003 回答
1

remove-duplicates有一个名称以“s”结尾的内置函数。

remove-duplicates接受一个:from-end带有布尔值的关键字参数来控制保留哪些重复值:列表中出现的第一个或最后一个。

请在Practical Common Lisp中阅读关于let和 about 的内容if/cond。这是一本很棒的书!

于 2019-11-29T09:16:50.793 回答