在球拍中定义变量时出现问题

Problem while defining variables in racket

我正在尝试创建一个递归函数,该函数从列表中选取 n 个项目,返回选取的值和没有值的列表,但是当我创建变量时,出现此错误:

new-list: unbound identifier in: new-list

这是我的代码:

(define(pick-randomr list n picked) ;;Picked always called as empty list
  (if(= n 0) (values list picked)
     ((let* ([aux list]
             [r (random (length aux))]              
             [value (list-ref aux r)]
             [new-picked (cons value picked)]
             [new-list (values (remove value aux))])
        (values aux r new-list))
      (pick-randomr new-list (- n 1) new-picked))))

编辑: 行:

 (values aux r new-list)

就是为了不空身

您的语法有几个问题:

  • 您不应使用 list 作为参数名称,它与同名的内置过程冲突。
  • 不要用 两个 括号将 let* 括起来,这是一个常见的错误,括号 不像 中的大括号其他语言,您不能使用它们来定义语句块,为此使用 begin - 但在这种特殊情况下我们不需要它。
  • 您得到的第一个错误声明您必须而不是定义一个let* 具有空主体。但是你添加的表达式不对,你必须写出使用let*里面的变量的表达式,否则new-list变量不会可见。

这就是您要写的内容:

(define (pick-randomr lst n picked)
  (if (= n 0)
      (values lst picked)
      (let* ([aux lst]
             [r (random (length aux))]              
             [value (list-ref aux r)]
             [new-picked (cons value picked)]
             [new-list (values (remove value aux))])
        (pick-randomr new-list (- n 1) new-picked))))

我们来测试一下:

(pick-randomr '(1 2 3 4 5) 2 '())
=> '(1 2 5)
   '(3 4)