没有正确检索列表索引处的字符?

Not retrieving the character at an index of a list correctly?

我正在编写一个递归遍历列表的程序,提供当前字符的索引和字符列表。但是,当我 运行 以下程序时:

(defun printAllElementsRecursively (index providedList)
    (if (>= index (length providedList))
        (return-from printAllElementsRecursively NIL)
    )
    (defvar currCharacter (nth index providedList))
    (print (format nil "Character at index ~a: ~a" index currCharacter))
    (printAllElementsRecursively (+ index 1) providedList)
)

(printAllElementsRecursively 0 '(A B B A))

我得到以下输出:

"Character at index 0: A" 
"Character at index 1: A" 
"Character at index 2: A" 
"Character at index 3: A" 

这看起来很奇怪,考虑到 index 的值确实递增。

你误用了 defvar:

  1. 它应该永远不会在函数内部使用,使用let代替或只使用(nth index providedList)代替currCharacter .

  2. 定义一个新的全局变量,并且只有在还没有的情况下才设置它,所以它设置 currCharacter 仅一次

你也不是真的需要return-from,你的代码 如果使用破折号而不是驼峰式大小写,将更具可读性。 例如,

(defun print-list-elements-recursively (list)
   (when list
     (print (first list))
     (print-list-elements-recursively (rest list))))

此外,nth 在其 list 参数的长度中是 linear, 所以你的函数是 quadratic (我的版本是 linear)。