方案:“预期1个参数,给出4”奇怪的行为

时间:2012-02-18 22:07:05

标签: lisp scheme racket

为了在网格中实现深度优先搜索,我写了一个像这样的函数

(define (expand dim node visited obs)
  (not-in (neighbor dim obs node) visited))

函数dfs是

(dfs dim obs visited fringe path goal)

dfs 扩展的唯一外观是

(expand dim (car fringe) visited obs)

我使用

调用 dfs
(dfs '(5 5) '((2 2) (3 2)) '((2 1)) '((1 1) (3 1)) '((2 1)) '(4 5))

dim 是网格的维度, obs 是网格中阻塞位置的列表。

当我手动调用 expand 时,它完美无缺。但是当它在 dfs 中调用时,它会说“ expand:期望1个参数,给定4:'(5 5)'(1 1)'((2 1))'((2 2)(3 2)(3 4)(4 4)(5 4))

但是,如果我更改 expand 的参数位置,例如把 obs 作为第二个参数,

(define (expand dim obs node visited)
  (not-in (neighbor dim obs node) visited))

并相应修改 dfs 和我的调用,然后错误将不会出现,一切正常。然后,下次启动DrRacket并将修改后的代码粘贴到其中时,会再次出现相同的错误。如果我将 obs 交换回来,它又能很好地运行...... 这到底发生了什么?!谢谢!

2 个答案:

答案 0 :(得分:1)

expand是一个非常通用的名称,可能在其他地方有定义。将您的功能重命名为dfs-expand,看看是否可以修复它。

答案 1 :(得分:1)

看起来这与你在this question中遇到的问题相同。与那种情况一样,expand是一个已在Racket中定义的函数,但编写自己的定义应该仍然可以正常工作。就像我在那里所说的那样,你应该首先描述完全你正在做什么,以便知道你为什么会遇到这些问题。