Scheme 如何在这个算法中正确使用点尾符号?
我正在做来自SICP(不是家庭作业)的练习,练习2.20引入了点尾符号,在这里你可以使用Scheme 如何在这个算法中正确使用点尾符号?,scheme,racket,variadic-functions,sicp,Scheme,Racket,Variadic Functions,Sicp,我正在做来自SICP(不是家庭作业)的练习,练习2.20引入了点尾符号,在这里你可以使用(define(fa.b)…来传递一个可变数量的参数(最终在列表b中)。这个问题特别需要一个过程,它接受整数a,并返回奇偶校验等于a的所有参数的列表。问题不难,;以下是我的解决方案: (define (same-parity a . b); a is an int, b is any number of int arguments (let ((parity (remainder a 2))) (
(define(fa.b)…
来传递一个可变数量的参数(最终在列表b
中)。这个问题特别需要一个过程,它接受整数a
,并返回奇偶校验等于a
的所有参数的列表。问题不难,;以下是我的解决方案:
(define (same-parity a . b); a is an int, b is any number of int arguments
(let ((parity (remainder a 2)))
(define (proc li)
(cond ((null? li) null)
; If parity of the head of the list is = parity of a,
((= (remainder (car li) 2) parity)
; keep it and check the rest of the list.
(cons (car li) (proc (cdr li))))
; Otherwise ignore it and check the rest of the list.
(else (proc (cdr li)))))
(cons a (proc b))))
我的问题是,我似乎根本没有使用点尾功能。我可能只接受了两个论点,一个数字和一个列表;我正在有效地将算法包装在一个过程proc
中,它消除了虚线尾的东西
在我编写这个解决方案之前,我希望有一个递归调用
(相同的奇偶校验a.(cdr b))
或者精神上相似的东西,但不管我怎么尝试,我总是传递清单或额外的程序或任何东西。这可能是因为我不知道
到底做什么,只知道我希望它做什么(Racket文档也没有清理任何东西)。总之,
我的解决方案是本练习的目的,还是有办法在算法中实际使用点符号(这似乎是本练习的重点)?您不能使用(相同的奇偶校验a.(cdr b))
(因为这将作为(相同的奇偶校验a cdr b)
)读取,但您可以使用(应用相同的奇偶校验a(cdrb))
。这就是将列表“splat”到参数中的方式
然而,您使用的“内部过程”方法通常更有效,因为正在进行的列表复制更少