Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Вычисления скалярного произведения векторов


Автор: 203 9.10.2015, 16:04
Здравствуйте. Помогите пожалуйста реализовать программу для вычисления скалярного произведения двух векторов. Координаты двух векторов заданы в виде списка. Элементами списков являются только числа, длина списков одинаковая.
(В программе нельзя использовать встроенные функции и циклы)

Языка Scheme можно сказать что вообще не знаю, побывал что-то написать, не получилось

Пишу на DrRacket
Код

#lang racket
(define list1 (list 1 2))
(define list2 (list 3 4))
(if(null? list1) (null? list2)
  (* (car list1) (car list2)))
  (define x (list-ref list1 1))
  (define y (list-ref list2 1))
  (* x y)



Заранее спасибо.

Автор: tzirechnoy 9.10.2015, 21:18
Цитата
(В программе нельзя использовать встроенные функции и циклы)


Учитывая, что +, -, *, > -- это встроенные функцыи -- ты, похожэ, как-то крепко попал... Ну, или не понял условие задачи.

Автор: jsharp36 10.10.2015, 12:03
Код

#lang racket
(define list1 (list 1 2))
(define list2 (list 3 4))

(define (product l1 l2) 
  (cond ((null? l1) 0)
        ((null? l2) 0)
        (else (+
                (* (car l1) (car l2))
                (product (cdr l1) (cdr l2))))))



Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vychisleniya-skalyarnogo-proizvedeniya-vektorov-id5617bbbcae20159a3f8b4567#findElement_E7045_5618d44cae2015bf7c8b45c7_0

Автор: jsharp36 10.10.2015, 12:13
Читайте https://mitpress.mit.edu/sicp/full-text/book/book.html

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vychisleniya-skalyarnogo-proizvedeniya-vektorov-id5617bbbcae20159a3f8b4567#findElement_E7045_5618d6b5ae2015667e8b46f3_0

Автор: 203 10.10.2015, 23:45
Цитата(tzirechnoy @ 9.10.2015,  21:18)
Цитата
(В программе нельзя использовать встроенные функции и циклы)


Учитывая, что +, -, *, > -- это встроенные функцыи -- ты, похожэ, как-то крепко попал... Ну, или не понял условие задачи.

Извините, не правильно сформулировал

Цитата

Код

#lang racket
(define list1 (list 1 2))
(define list2 (list 3 4))

(define (product l1 l2) 
  (cond ((null? l1) 0)
        ((null? l2) 0)
        (else (+
                (* (car l1) (car l2))
                (product (cdr l1) (cdr l2))))))



Спасибо большое за ответ.
Подскажите пожалуйста как вывести результат, а то программа выполняется а ответ не выводит.
Хотел ещё спросить, как допустим сложить ответы списков. Сейчас в программе на выходе 2 числа допустим это 3 и 8, как их сложить между собой, чтобы в ответе получилось одно число 11.

Автор: jsharp36 11.10.2015, 09:53
В интерактивном окне напишите после знака >

(product list1 list2)

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Vychisleniya-skalyarnogo-proizvedeniya-vektorov-id5617bbbcae20159a3f8b4567#findElement_E7045_561a077aae2015354db12c7c_0

Автор: 203 9.11.2015, 19:32
Спасибо за ответы, может ещё кто поможет сделать эту задачу с помощью макросов если не трудно. Вот последний мой вариант задачи (там 2 способа решения)

Код

#lang racket
(define list1 (list 2 2))
(define list2 (list 3 -3))
 
(define (var1 l1 l2) 
  (cond ((null? l1) 0)
        ((null? l2) 0)
        (else (+
                (* (car l1) (car l2))
                (var1 (cdr l1) (cdr l2))))))
 
(define (var2 l1 l2)
  (cond ((null? l1) 0)
        ((null? l2) 0)
        (else
         (apply +(map * l1 l2)))))
 
(if (= (var2 list1 list2) 0) 'ortogonalni 'neortogonalni)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)