0

我在尝试定义一个函数时遇到了一些麻烦,该函数生成一个长度为 x 的列表,该列表由 [0, y) 范围内的随机整数组成。这是生成随机整数列表的代码:

(define (random-list range list-length)
  (cond
    [(zero? length) empty]
    [else (cons (random range) (random-list range (sub1 list-length)))]))

问题在于,如果我尝试将此代码转换为使用递归生成从 0 到(范围 - 1)长度(列表长度)的唯一随机整数列表的代码。我似乎无法找到一种方法来检查生成的随机数是否已经在正在创建的列表中。此代码永远运行:

(define (random-list range list-length)
  (cond
    [(zero? list-length) empty]
    [else
     (cond
       [(member? (random range) (random-list range list-length))
        (random-list range list-length)]
       [else
        (random-list range (sub1 list-length))])]))

有任何想法吗?(我正在使用 DrRacket,初级学生)

4

1 回答 1

1

第一个过程有错误,你应该检查是否list-length为零,而不是length。关于第二个过程,检查元素是否已经在列表中的测试是错误的,您random-list在检查元素是否已经存在时调用它然后再次调用它,但是您从未保存生成的值。在每种情况下生成的数字可能会有所不同,无论如何您都没有cons得到结果。必须使用完全不同的方法。

; create a helper that accumulates the generated elements
(define (random-list-h acc range len)
  (cond [(zero? len) acc] ; if we're done, return accumulator
        [else
         (let ((num (random range))) ; generate and save a random number
           (cond [(member? num acc)  ; if it's already in the accumulator
                  (random-list-h acc range len)] ; then ignore it
                 [else ; otherwise add to accumulator and advance recursion
                  (random-list-h (cons num acc) range (sub1 len))]))]))

(define (random-list range list-length)
  ; call helper with initial empty accumulator
  (random-list-h '() range list-length))

它会像宣传的那样工作:

(random-list 10 5)
=> '(5 3 7 9 6) ; just an example
于 2013-11-01T01:21:37.303 回答