Как я могу сделать свою среднюю функцию хвостовой рекурсивной в Лиспе - PullRequest
0 голосов
/ 09 ноября 2019

Я просто пытаюсь сделать эту среднюю функцию хвостовой рекурсивной. Мне удалось заставить свою функцию работать, и это потребовало значительных усилий. Впоследствии я пошел спросить своего профессора, была ли моя работа удовлетворительной, и он сообщил мне, что

  1. моя функция avg не была хвостовой рекурсивной
  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

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Так вот что у меня сейчас

    (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 голосов
/ 10 ноября 2019
(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)))
...