我正在创建一个启发式函数,它返回它应该的内容,但也存在堆栈溢出问题,我无法理解问题出在哪里。这是我创建的函数的代码:
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
}
}
它返回的列表是它应该返回的,但是我无法理解堆栈溢出问题。
代码的调用如下:
{{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;文档强>
写评论和文档可能也是个好主意。 否则,必须猜测/推断这些函数的用途是什么。