【问题标题】:A recursive function to return the nth element in lisp返回 lisp 中第 n 个元素的递归函数
【发布时间】:2013-11-16 16:08:03
【问题描述】:

我想验证这是否是递归函数?需要返回第 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))))))))

【问题讨论】:

  • 不,它不是递归函数。通常,递归函数会调用自己,因此您应该在 nth2 的定义中看到 nth2
  • 如果我回忆起类似 (n-1) 的函数

标签: recursion common-lisp


【解决方案1】:

正如我在answer 中所写,您需要避免使用递归函数的setqsetf 等。

您可以倒数,而不是向上计数并使用额外的变量。假设索引从 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))))

【讨论】:

  • 好的,我该怎么做?我是否先尝试在纸上解决问题,然后再编写代码?
  • 你需要找一个好的Scheme介绍;我个人发现像The little Schemer这样的书非常有帮助。把它写在纸上确实是个好主意。
  • 顺便说一句 - 对于您在此处发布的问题,您尚未接受任何答案。如果至少有一个正确答案,请接受您最喜欢的一个。
  • 是的,我刚刚看到我们应该这样做。我正在搜索。
【解决方案2】:

以下是递归工作原理的一般概述...每个递归函数都必须具有:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多