这是任务:
编写一个函数(random-number-list n lim),返回 0 到 lim-1 范围内的 n 个随机整数的列表
这是我的代码:(我在 DrRacket 中使用#lang EOPL)
(define (random-number-list n lim)
(letrec ((maker
(lambda (n lim result)
(let loop ((g lim) (result '()))
(if (= g 0)
result
(loop (- lim 1) (cons (random lim) result)))))))
(maker n lim '())))
这应该是它产生的结果:
(random-number-list 10 20) => (1 11 4 18 3 12 17 17 8 4)
当我运行代码时,我收到一个处理“(随机 lim)”的错误。随机的东西。请问有人知道原因吗?另外,我走在正确的轨道上吗?
最佳答案
您的代码的主要问题在于这一行:
(loop (- lim 1) (cons (random lim) result))
您正在递减 lim
,但针对 g
进行测试,它保持不变,导致无限循环。此外,g
在这一行中被错误地初始化:
((g lim) (result '()))
这应该可以解决问题:
(define (random-number-list n lim)
(letrec ((maker
(lambda (n lim result)
(let loop ((g n) (result '()))
(if (= g 0)
result
(loop (- g 1) (cons (random lim) result)))))))
(maker n lim '())))
鉴于您正在使用 Racket,请知道可以使用更简单的解决方案:
(define (random-number-list n lim)
(build-list n (lambda (x) (random lim))))
无论哪种方式,它都会按预期工作:
(random-number-list 10 20)
=> '(13 7 5 9 3 12 7 8 0 4)
关于scheme - EOPL/ Racket /方案两个号码之间的随机号码列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32720070/