Scheme 可选关键字参数和多参数练习
我必须编写一个函数pow increase,它接受任意数量的参数和一个可选参数。对于每个参数,它必须计算其对某个数字的幂,该幂从数字2开始递增,或者,如果提供了可选的关键字参数,则从该数字开始递增 例如:Scheme 可选关键字参数和多参数练习,scheme,racket,Scheme,Racket,我必须编写一个函数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) 我已经为第一次调用编写了函数: (d
> (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)))))
现在我想编写函数的第二个版本(用于第二个调用),但我不知道如何同时传递任意数量的参数和可选的关键字参数。我已经阅读了可选参数的语法:[optParamName value]
提前感谢您的帮助 我会去的
(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的循环,代码会变得多么优雅。如果您想继续使用初始版本,修改将是:
(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))))