在 NetLogo 5.x 中处理递归过程的简单练习似乎出现了一个问题。该模型模拟海龟一次游荡一个补丁并从补丁中收集 M&M。目标是使用递归过程调用来允许找到 M&M 的海龟获得额外的两个回合。这可以通过非递归方法轻松完成,其中我们使用变量来跟踪转数。但是,这种情况下我们需要用到递归,而递归似乎会导致一个莫名其妙的问题:
patches-own [MM]
turtles-own [collection]
to setup ;; observer
ca
random-seed 1234
ask patches [ set MM random 6 ]
ask patches [ set plabel-color grey - 3
set plabel MM ]
crt 10 [ set color grey
set heading (random 4 * 90)
set collection 0
set label-color yellow ]
end
to go ;; observer
ask turtles [ collect ]
if max [ MM ] of patches = 0 [ stop ]
end
to collect ;; turtles
rt (90 * random 4)
fd 1
if [ MM ] of patch-here > 0
[ set collection collection + 1
set MM MM - 1
set label collection
set plabel MM
collect
collect
]
end
如果此代码正常运行,那么每次海龟遇到 M&M 时,都应该生成并运行两个 collect 子实例。这可能正在发生,然而,发生的事情是海龟一旦击中零 M&M 的补丁就会停止收集狂欢。因此,此代码产生的结果与 collect 仅调用自身一次以及 collect 调用自身 3 次或更多次时的结果相同。
这使我相信if
递归运行的条件可能会导致问题,因为将递归调用放在条件之外会起作用。NetLogo 似乎不以某种方式尊重递归。例如,如果您collect collect
在过程末尾的行周围插入调试代码:
show "!"
collect
show "two"
collect
show "three"
]
show "four"
end
然后只!
打印four
到指挥中心,但其他人从不执行。关于为什么以这种方式工作的任何帮助都会很有用。看起来更像是错误而不是功能。