如何在Lisp中使平均函数尾部递归

问题描述 投票:0回答:2

我只是试图使该平均函数成为尾递归。我已经设法使我的职能发挥作用,并且付出了相当大的努力。之后我去问教授,我的工作是否令人满意,他告诉我

  1. 我的平均功能不是尾递归的
  2. 对于包含多个元素的列表,avg无法产生正确的输出

在过去2个小时中,我一直在使用此代码,但遇到了一些困难。谁能帮助我确定我在这里不了解的内容。

向我的教授讲话,他很有帮助!

    (defun avg (aList)
        (defun sumup (aList)
            (if (equal aList nil) 0
                ; if aList equals nil nothing to sum
                (+ (car aList) (sumup (cdr aList)) )
            )
        )

        (if 
            (equal aList nil) 0
            ; if aList equals nil length dosent matter
            (/ (sumup aList) (list-length aList) )
        )
    )

    (print (avg '(2 4 6 8 19))) ;39/5

我的测试预期结果会在39/5之后立即发表评论

recursion lisp common-lisp tail-recursion
2个回答
1
投票

所以这就是我现在拥有的

    (defun avg (aList &optional (sum 0) (length 0))

            (if aList 
            (avg (cdr aList) (+ sum (car aList))
            (+ length 1)) 
            (/ sum length)))

    (print (avg '(2 4 6 8 19))) ;39/5

0
投票
(defun avg (list &optional (sum 0) (n 0))
   (cond ((null list) (/ sum n))
         (t (avg (cdr list) 
                 (+ sum (car list)) 
                 (+ 1 n)))))

与之相同:

(defun avg (list &optional (sum 0) (n 0))
   (if (null list) 
       (/ sum n)
       (avg (cdr list) 
            (+ sum (car list)) 
            (+ 1 n))))

或更类似于您的著作:

(defun avg (list &optional (sum 0) (n 0))
   (if list
       (avg (cdr list) 
            (+ sum (car list)) 
            (+ 1 n))
       (/ sum n)))
© www.soinside.com 2019 - 2024. All rights reserved.