函数中的代码未执行

时间:2016-11-05 14:12:40

标签: recursion common-lisp binary-tree binary-search-tree inorder

我是Lisp的全新手,所以对我很轻松。我试图将二进制搜索树实现为一个数组,并能够按顺序输出它。 我有这个数组,其中索引1是根,2 * i是左子,2 * i + 1是正确的孩子:

#(NIL 30 15 50 10 20 NIL 70 3 NIL 17 NIL NIL NIL NIL 80 NIL NIL NIL NIL NIL NIL
  NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
  NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
  NIL NIL NIL)

我发送它到这个函数来提取树的顺序输出:

(defun inOrder (tree rootIndex)
  (setq leftI (* rootIndex 2))
  (setq rightI (+ leftI 1))
  (if (aref tree leftI)
      (inOrder tree leftI))
  (format t "~D," (aref tree rootIndex))
  (if (aref tree rightI)
      (inOrder tree rightI)))

预期产量应为3,10,15,17,20,30,50,70,80,但我得到3,10,15,30。 似乎格式之后的代码没有被执行。如果有人能帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您使用leftIrightI作为绝对变量,因此递归不能按预期工作。相反,使用let*

将它们定义为局部变量
 (defun inOrder (tree rootIndex)
   (let* ((leftI (* rootIndex 2))
          (rightI (+ leftI 1)))
     (if (aref tree leftI) 
         (inOrder tree leftI))
     (format t "~D," (aref tree rootIndex))
     (if (aref tree rightI)
         (inOrder tree rightI))))