在Scheme中制作一个随机列表

时间:2012-11-25 21:58:31

标签: list random scheme

我只是想随机创建一个列表并在更大的函数中使用它。

        (define make-random-list
        (if
          (= (random 2) 0) (list 2 3)
                           (list 3 2)))

这只生成列表(2 3),我不知道为什么。是怎么回事?

如果我像这样写

,我可以使功能正常工作
  (define make-random-list
   (lambda (x)
   (if
    (= (random x) 0) (list 2 3)
                     (list 3 2))))

并致电(make-random-list 2)

但我不明白为什么会这样,而另一个则不行。如果方案不允许第一个函数产生随机结果会怎样?

2 个答案:

答案 0 :(得分:1)

在您的第一个片段中,您将一次性计算的结果分配给变量。你需要的是定义一个每次调用时都要评估的函数。你的第二个片段确实如此,但有一个较短的表达方式:

(define (make-random-list x)
(if
  (= (random x) 0) (list 2 3)
                   (list 3 2)))

请注意语法的不同之处:函数定义将函数定义与括号中的形式参数名称一起包含在内,而变量名称周围没有括号。

答案 1 :(得分:1)

在Scheme中,函数通过显式使用lambda来定义,如下所示:

(define square
  (lambda (x)
    (* x x)))

或者像这样,这是前面语法的简写,隐含地使用了lambda - 这两种程序定义完全等同:

(define (square x)
  (* x x))

您的代码的第一个版本无效,因为这只是将if的评估结果分配给名为make-random-list的变量:

(define make-random-list
  (if (= (random 2) 0)
      (list 2 3)
      (list 3 2)))

为了在Scheme中定义过程,您必须显式或隐式地使用lambda。因此,您的程序应使用以下任一等效形式定义:

(define make-random-list
  (lambda ()
    (if (= (random 2) 0)
        (list 2 3)
        (list 3 2)))

(define (make-random-list)
  (if (= (random 2) 0)
      (list 2 3)
      (list 3 2)))

请注意,如果唯一可能的值是x,则不必传递2参数,只需声明一个没有参数的过程。