我必须编写一个函数pow-increase,它接受任意数量的参数和一个可选参数。对于每个参数,它必须计算其对某个数字的幂,该数字对于每个参数递增,从数字2开始,或者,如果提供了可选关键字参数,则以该数字开始。
示例:
> (pow-increase 2 2 2 2) ; 2^2 2^3 2^4 2^5
'(4 8 16 32)
> (pow-increase #start: 1 2 2 2 2) ; 2^1 2^2 2^3 2^4
'(2 4 8 16)
我已经为第一个电话编写了这个函数:
(define pow-increase
(lambda argList
(let* ([len (length argList)]
[exponents (range 2 (+ len 2) 1)])
(map (lambda (x) (expt (car x) (car(cdr x)))) (zip argList exponents)))))
现在我想写第二个版本的函数(第二次调用),但我不知道如何同时传递任意数量的参数和一个可选的关键字参数。我读过here可选参数的语法是:[optParamName value]。
提前感谢您的帮助。
答案 0 :(得分:1)
我会去
(define (pow-increase #:start (start 2) . lst)
(for/list ((e (in-list lst)) (i (in-naturals start)))
(expt e i)))
测试
> (pow-increase 2 2 2 2)
'(4 8 16 32)
> (pow-increase #:start 1 2 2 2 2)
'(2 4 8 16)
请注意,如果使用Racket的for
循环,代码会变得多么优雅。如果您想保留初始版本,修改将是:
(define pow-increase
(lambda (#:start (start 2) . argList)
(let* ([len (length argList)]
[exponents (range start (+ len start) 1)])
(map (lambda (x) (expt (car x) (car (cdr x)))) (zip argList exponents)))))
但即便如此,您可以通过删除zip
来简化,因为map
允许多个列表:
(define pow-increase
(lambda (#:start (start 2) . argList)
(let* ([len (length argList)]
[exponents (range start (+ len start) 1)])
(map expt argList exponents))))