在计划中打印前两个数字

时间:2014-04-20 19:06:26

标签: scheme racket

我正在尝试在Scheme中编码的列表中打印前2个数字。我这样做有点麻烦。我运行程序时出错。关于如何让它工作的任何建议

(定义(print-two-nums n nums)

(list-ref nums(+(cdr nums)n))) (print-two-nums 2'(5 5 4 4))

2 个答案:

答案 0 :(得分:1)

看起来你在“打印两个数字”和“打印 n 数字”的想法之间摇摆不定。如果你真的只想要列表的两个第一个数字,你可以写:

(define (print-two-nums nums)
  (print (list (car nums) (cadr nums))))

但是对于更一般的第一个 n 号码,您可以使用:

(define (print-n-nums n nums)
  (print (take nums n)))

答案 1 :(得分:0)

要打印第一个n号码,您可以使用此简单程序

 (define (print-n-nums L n) (cond
                   ((or (= 0 n) (null? L)) '())
                   (else (cons (car L) (print-n-nums (cdr L) (- n 1))))))



(print-n-nums (list 1 2 3) 2)
;Output: (1 2)

您可以进一步抽象 cons操作,并将print-n-nums定义为更高阶的过程,以执行所需的操作。例如,如果我们想要添加列表的第一个n个数字,我们可以定义以下过程。这里OPERATION是我们传递给list-operator函数的函数。因此,这里我们要执行+操作。在上面的例子中,我们想要执行cons操作。 initial参数就是我们想要处理边缘情况的方式。

(define (list-operator L n OPERATION initial) (cond
           ((or (= 0 n) (null? L)) initial)
           (else (OPERATION (car L) (list-operator (cdr L) (- n 1) OPERATION initial)))))

(list-operator (list 1 2 3) 2 + 0)
;Output: 3

现在,如果你想要第一个2数字的产品,你就可以了

(list-operator (list 1 2 3) 2 * 1)