2010-04-21 51 views
1

我需要编写函数sum-squares的非递归版本并使用基于参数列表长度的do循环。Lisp中的平方和

+0

我敢肯定,你怎么做。 – zmbush 2010-04-21 05:51:26

+1

我不知道如何写它...我希望有人可以帮助 – bubdada 2010-04-21 05:52:13

+2

这听起来像作业。另外,Lisp是围绕递归构建的,为什么你想避免它? – zmbush 2010-04-21 05:55:50

回答

1

下面是它一般都做:

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

DO循环的解决方案更简单,而不是一半优雅:

(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 2010-04-21 06:55:24

+1

+ 1来自我的评论。我特别详细地写了这个循环,以便该示例可以显示循环结构的完整结构 - 我认为这可能会以这种方式向初学者提供信息。至于第二个例子 - orcik想要一个使用参数列表长度的解决方案 - 否则我肯定会迭代元素本身。 – 2010-04-21 07:50:52