EOPL /球拍/方案随机数两个数字之间的列表

时间:2015-09-22 14:48:31

标签: scheme racket

这个任务:

编写一个函数(random-number-list n lim),它返回0到lim-1范围内n个随机整数的列表

这是我的代码:(我在DrRacket中使用#lang EOPL)

(random-number-list 10 20) => (1 11 4 18 3 12 17 17 8 4)

这应该是它产生的东西:

???

当我运行代码时,我收到一个处理“(random lim)”的错误。随机的东西。有人知道原因吗?我也在正确的轨道上吗?

2 个答案:

答案 0 :(得分:2)

您收到错误的主要原因是langiage #!eopl没有名为random的过程。如果您eported symbols of eopl it根本不存在。它确实存在于#!racket中。

正如奥斯卡指出的那样,存在一些导致无限循环的逻辑错误。一个诚实的错误,但我也注意到你在内循环中使用g而不是n。使用原始名称而不是选择的局部变量是非常常见的,因此不做错误的常见方法是遮蔽原始变量。

也只需要一个本地程序。以下是我保留名为letletrec

的更正
#!racket

;; with letrec
(define (random-number-list n lim)
  (letrec ((maker
            (lambda (n result)
              (if (zero? n)
                  result
                  (maker (- n 1)
                         (cons (random lim) result))))))
    (maker n '())))

;; with named let
(define (random-number-list2 n lim)
  (let maker ((n n) (result '()))
    (if (zero? n)
        result
        (maker (- n 1)
               (cons (random lim) result)))))

我离开lim因为它永远不会改变,我使用相同的名称maker来说明它与这两者中发生的完全相同,只是语法不同。许多实现实际上将名为let的内容重写为与letrec版本非常相似的内容。

答案 1 :(得分:0)

替代方案:

(define (random-number-list n lim)
   (build-list n (λ (x) (random lim)))

此处build-list会构建n个元素的列表。 每个元素都是调用(λ (x) (random lim))的结果 它会忽略x并返回0到lim-1之间的随机数。