2010-04-21 5 views
1

Мне нужно написать нерекурсивную версию функции sum-square и использовать do-loop, основанный на длине списка аргументов.Сумма квадратов в Lisp

+0

Я уверен, что вы делаете. – zmbush

+1

Я понятия не имею, как это написать ... Надеюсь, кто-то может помочь – bubdada

+2

Это звучит как домашнее задание. Кроме того, Lisp построен вокруг рекурсии, почему вы хотите его избежать? – zmbush

ответ

1

Вот как это делается обычно:

(defun sum-squares (list) (loop for x in list 
       for y = (* x x) 
       summing y into total 
       finally (return total))) 

А до решения петли еще проще, но не половина элегантны:

(defun sum-squares (list) 
     (let ((sum 0)) (do ((i 0 (1+ i))) 
       ((>= i (length list))) 
      (setq sum (+ sum (* (nth i list) (nth i list))))) 
       sum)) 
+3

Почему бы не (цикл для x в суммировании списка (* x x)). Любое ваше решение для петли - O (n^2); попробуйте выполнить итерацию непосредственно в элементах списка, а не индексы. – huaiyuan

+1

+ 1 от меня за отличный комментарий. Я написал цикл, особенно подробный, так что пример мог бы показать полную структуру конструкции цикла - я думал, что это может быть информативным для новичков таким образом. Что касается второго примера, Orcik хотел найти решение, которое использовало длину списка аргументов, иначе я бы наверняка повторил эти элементы. –

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