scheme - EOPL/ Racket /方案两个号码之间的随机号码列表

标签 scheme racket

这是任务:

编写一个函数(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/

相关文章:

scheme - Guile Scheme 解释器中奇怪的乘法行为

racket - 我什么时候应该使用 syntax/loc 而不是 #' (又名语法)?

scheme - Scheme 中的 foldr 和 apply 有什么区别?

scheme - Racket 中的while循环?

functional-programming - 在Scheme中编写一个自动内存。帮助宏和包装器

scheme - x 和x 的集合在Scheme 中的let 中不起作用

scheme - 有没有办法从 Racket 中返回 `(values 1 2 3)` 的函数访问第 n 个返回值?

macros - 如何在 lisp 中用 if 形式定义递归 cond 宏?

scheme - 来自 Racket 的产卵或系统

racket - 访问 eval 中当前绑定(bind)的对象