这个任务:
编写一个函数(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)”的错误。随机的东西。有人知道原因吗?我也在正确的轨道上吗?
答案 0 :(得分:2)
您收到错误的主要原因是langiage #!eopl
没有名为random
的过程。如果您eported symbols of eopl it根本不存在。它确实存在于#!racket
中。
正如奥斯卡指出的那样,存在一些导致无限循环的逻辑错误。一个诚实的错误,但我也注意到你在内循环中使用g
而不是n
。使用原始名称而不是选择的局部变量是非常常见的,因此不做错误的常见方法是遮蔽原始变量。
也只需要一个本地程序。以下是我保留名为let
或letrec
:
#!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
之间的随机数。