在scheme中打印前两个数字

在scheme中打印前两个数字,scheme,racket,Scheme,Racket,我试图打印Scheme中编码的列表中的前两个数字。我做这件事有点麻烦。我在运行该过程时出错。有什么建议可以让我的工作吗 (定义(打印两个NUM n NUM) (列表参考nums(+(cdr nums)n))) (打印两个NUM 2’(5 5 4))看起来你在“打印两个数字”和“打印n个数字”的想法之间摇摆不定。如果你真的只想要列表的前两个数字,你可以写: (define (print-two-nums nums) (print (list (car nums) (cadr nums))))

我试图打印Scheme中编码的列表中的前两个数字。我做这件事有点麻烦。我在运行该过程时出错。有什么建议可以让我的工作吗

(定义(打印两个NUM n NUM)

(列表参考nums(+(cdr nums)n)))
(打印两个NUM 2’(5 5 4))

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

(define (print-two-nums nums)
  (print (list (car nums) (cadr nums))))
但对于更一般的前n个数字,您可以使用:

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

要打印第一个
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
编号,我们可以定义以下过程。这里的
操作
是传递给
列表操作符
函数的函数。因此,这里我们要执行
+
操作。在上述情况下,我们希望执行
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)

我需要打印n个数字,所以你给我的第二个例子就是那个。然而,我在实现它的时候遇到了问题,怎么会呢?您使用的是没有“take”的方案子集吗?如果是这样的话,你可以用
cons
car
cdr
来滚动你自己的;无法引用未定义的标识正在尝试将“打印”替换为“显示”。