我正在尝试在Scheme中编码的列表中打印前2个数字。我这样做有点麻烦。我运行程序时出错。关于如何让它工作的任何建议
(定义(print-two-nums n nums)
(list-ref nums(+(cdr nums)n))) (print-two-nums 2'(5 5 4 4))
答案 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)