制作方案随机列表(Making a random list in Scheme)

2019-10-17 10:14发布

我只是想随意让一个列表,并在更大的功能使用。

        (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))))

并调用(使随机列表2)

但我不明白为什么会工作,另一个不会。 这是怎么回事用方案,将不允许第一函数来产生随机的结果?

Answer 1:

在你的第一个片段,就分配一次计算到变量的结果。 你所需要的就是定义将在每次它被调用时进行评估的功能。 你的第二个片段正是这么做的,但表达同样一个较短的方式:

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

注意语法的区别:一个函数的定义,在括号中的正式参数名一起包住函数定义,同时有周围变量名没有括号。



Answer 2:

在流程,功能是通过明确使用规定的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)))

对于计划确定的程序,你必须使用一个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 ,简单地声明一个过程,不带参数。



文章来源: Making a random list in Scheme