Recursion 在lisp中返回第n个元素的递归函数

Recursion 在lisp中返回第n个元素的递归函数,recursion,common-lisp,Recursion,Common Lisp,我想验证这是否是一个递归函数?需要返回第n个元素,我的工作正常,我只是想确定一下 (defun nth2(n lst) (let((count 1)) (loop (cond((equal count n)(return (car lst)))) (setq count (+ count 1)) (setq lst (cdr lst))))) 嗯。我刚试过这个主意。它给

我想验证这是否是一个递归函数?需要返回第n个元素,我的工作正常,我只是想确定一下

(defun nth2(n lst)
       (let((count 1))
           (loop
               (cond((equal count n)(return (car lst))))
               (setq count (+ count 1))
               (setq lst (cdr lst)))))
嗯。我刚试过这个主意。它给了我一个错误:不在名为NIL的块内

(defun nth2(n lst)
    (let((count 1))
      (cond((equal count n)(return (car lst)))
          (t(setq count (+ count 1))
          (nth2(count (cdr (lst))))))))

下面是递归工作原理的概述。。。每个递归函数必须具有:

  • 至少有一个基本情况:在基本情况下,递归函数直接执行某些操作,而不调用自身。一个好的递归函数具有简单、易于理解的基本情况。递归函数有基本情况,因为递归必须在某个地方停止

  • 至少一个递归案例:在递归案例中,递归函数将复杂问题分解为一个或多个更容易解决的问题,并通过调用自身来实现。用于调用自身的参数最终需要使其更接近基本情况(例如,使用
    n-1
    (cdr my list)
    ),以便递归停止

  • 您的函数没有任何递归案例,因此它不是递归函数。为了使其递归,请考虑:

  • 我希望我的基本情况是什么?什么是容易解决的问题?(提示:很容易替换列表前面的值。)

  • 我希望我的递归案例是什么?如何使问题看起来更像我的基本情况

  • 正如我在本文中所写,您需要避免使用递归函数使用
    setq
    setf

    您可以倒计时,而不必向上计数并使用额外的变量。假设索引从0开始,例如:

      (nth2 2 '(a b c d e))
    = (nth2 1 '(b c d e))
    = (nth2 0 '(c d e))
    = (car '(c d e))
    = 'c
    
    因此,在删除第一个元素时,必须递归到0,然后在索引为0时返回第一个元素:

    (defun nth2 (n lst)
      (if (zerop n)
        (car lst)
        (nth2 (1- n) (cdr lst))))
    

    不,它不是递归函数。一般来说,递归函数调用它们自己,因此您应该在
    nth2
    的定义中看到
    nth2
    。如果我用(n-1)之类的东西来调用函数,那么我应该如何继续?我是否先尝试在纸上解决问题,然后编写代码?您需要找到一个很好的方案介绍;我个人觉得像《小阴谋家》这样的书非常有用。把它写在纸上确实是个好主意。顺便说一句,你还没有接受你在网上发布的问题的任何答案。如果至少有一个正确答案,请接受你最喜欢的答案。是的,我刚刚看到我们应该这样做。我在找。