2017-02-02 8 views
0

Как это сделать в схеме? пример ввод будетСхема с использованием карты по аргументам разного размера

(scalar-mult '(1 2) 2) 

с выходом

'(2 4) 

вот что я пытался до сих пор:

(define (scalar-mult vec s) 
    (map (λ (vec s) (* s vec)) vec s)) 

Я видел другую аналогичная нить рекомендует CONCAT и повторите, но, похоже, не работает по схеме

ответ

0

l - это список, m множитель и e элемент списка.

Попробуйте это:

(define scalar-mult 
    (lambda (l m) 
    (map (lambda (e) 
      (* e m)) 
     l))) 

Функция map принимает два аргумента. Сначала функция, которая применяется к каждому элементу списка и во втором списке.

0

Что вы пытаетесь перебирать элементы списка 2, что смешно. Если вы хотите 2 быть доступен как переменная просто не упоминают его и передать его так:

(define (scalar-mult vec s) 
    (map (λ (vec) (* s vec)) vec)) 

Чтобы ответить на этот вопрос, когда списки разного размера:

map в стандартной схеме требует что аргументы списка имеют точно такой же размер, однако у вас есть SRFI-1, который работает так, как будто все списки имеют одинаковое количество элементов, таких как самый короткий список.

#!r6rs 

(import (except (rnrs base) map for-each) 
     (srfi :1)) 

(map (lambda (n1 n2) (+ n1 n2)) 
    (circular-list 1 2) ; infinite list with 1, 2 repeating 
    '(2 3 4 5)) 
; ==> (3 5 5 7)