2014-08-22 6 views
2

Мне нужно написать функцию pow-incre, которая принимает произвольное количество аргументов и один необязательный параметр. Для каждого аргумента он должен вычислить свою мощность на некоторое число, которое увеличивается для каждого аргумента, начиная с номера 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].

Заранее благодарю вас за помощь.

ответ

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) 

Обратите внимание, как элегантный код может стать, если вы используете 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)))) 
Смежные вопросы