可选的关键字参数和多个参数练习

时间:2014-08-22 10:16:53

标签: 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)

我已经为第一个电话编写了这个函数:

(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]。

提前感谢您的帮助。

1 个答案:

答案 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))))