2016-10-19 2 views
0

Я пытаюсь определить функцию dot-prod, которая принимает два списка в качестве параметров и применяет версию точечного продукта, принимая x1 * y1 + x2 * y2 и так далее. Я получил его для работы с пустым списком, но это все. Благодарю.Функция функции точка-точка двух списков

(define (dot-prod l1 l2) 
     (cond ((or (null? l1)(null? l2)) '()) 
      (else 
      (cons (* (car l1) (car l2)) 
        (* (cdr l1) (cdr l2)))))) 

ответ

2

Это идеальное решение для использования встроенных процедур. Если предположить, что списки имеют одинаковую длину:

(define (dot-prod l1 l2) 
    (apply + (map * l1 l2))) 

Но если вы хотите, чтобы написать решение с нуля, вы должны:

  1. Вернуть значение, которое имеет смысл для базового случая - если это дополнение , мы хотим, чтобы ноль там, а не пустой список, мы не строим новый список в качестве выходного сигнала
  2. Вызовите dot-prod процедуру в шаге рекурсии, то, что вы полностью забыли
  3. Объединить результат по значению - опять же, если мы делаем дополнение , Мы хотим использовать + не cons

Это то, что я имею в виду:

(define (dot-prod l1 l2) 
    (cond ((null? l1) 0) 
     (else 
     (+ (* (car l1) (car l2)) 
      (dot-prod (cdr l1) (cdr l2)))))) 

В любом случае, это работает, как ожидалось:

(dot-prod '(1 2 3) '(4 5 6)) 
=> 32 
+1

Я бы сказал, что '(foldl + (map * l1 l2))' лучше, чем использовать 'apply' здесь. –

1

'для/суммы' цикл может быть используется здесь для простой понятной функции. Если L и К 2 перечислены:

(define (dotproduct l k) 
    (for/sum ((i l)(j k)) 
    (* i j))) 

Тестирование:

(dotproduct '(1 2 3) '(4 5 6)) 
; =>32 

Это также может быть изменен, если (ху) значения встречаются в виде списка списков:

(define (f l) 
    (for/sum ((i l)) 
    (apply * i))) 

(f '((1 4)(2 5)(3 6))) 
; => 32 

Метод также расширяется, если нужно оценить x, y, z или еще больше значений.

Смежные вопросы