Lisp Stack溢出递归函数

时间:2016-12-07 20:12:00

标签: recursion lisp stack-overflow

我正在创建一个启发式函数,它返回它应该的内容,但也存在堆栈溢出问题,我无法理解问题出在哪里。这是我创建的函数的代码:

initialiseTable:function(dim){
    for (let i=0; i<dim; i++){
      var arr = []; // every time, create a new array
      for ( let j = 0; j < dim; j++) {
         arr.push ( '0' ); // the stuff to the new one
      }
      this.table.push(arr); // add to the table
    }
  }

结果如下: result

它返回的列表是它应该返回的,但是我无法理解堆栈溢出问题。

代码的调用如下:

{{1}}

这是一个本地测试,这段代码由我们的教授提供,用于测试我们的代码,以及为什么我认为问题不存在。

任何想法可能是什么问题? 感谢。

1 个答案:

答案 0 :(得分:0)

关于风格

通常代码编写得不好,因为它使用了太多的控制结构和不需要的变量。

示例:

(defun push-unique (element lista)
  (let ((auxlist lista))
    (dolist (i lista)
      (if (and (equal (nth 0 i)
                      (nth 0 element))
               (equal (nth 1 i)
                      (nth 1 element)))
          (return-from push-unique auxlist)))
    (push element auxlist)
    auxlist))
  • 不必要的变量auxlist
  • 不需要dolist,请使用member
  • 不需要return-from,只需返回值即可。在许多情况下,使用return-from代码气味,表示代码太复杂。
  • 不需要push,只需返回cons
  • 的结果

更好:

(defun push-unique (element list)
  (if (member element list
              :test (lambda (a b)
                      (and (equal (first a) (first b))
                           (equal (second a) (second b)))))
      list
      (cons element list)))

该功能已存在

函数push-unique已存在于标准Common Lisp中。它被称为adjoin

CL-USER 34 > (adjoin 1 '(2 3 4 1 3))
(2 3 4 1 3)

CL-USER 35 > (adjoin 1 '(2 3 4 3))
(1 2 3 4 3)

为您的目的传递正确的测试功能......

(defun push-unique (element list)
  (adjoin element list
          :test (lambda (a b)
                  (and (equal (first a) (first b))
                       (equal (second a) (second b))))))

评论&amp;文档

写评论和文档可能也是个好主意。 否则,必须猜测/推断这些函数的用途是什么。