在NetLogo 5.x中处理递归过程的简单练习似乎出现了一个问题。该模型模拟海龟一次游荡一个补丁并从补丁中收集M& Ms。目标是使用递归过程调用以允许找到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& Ms的情况下击中补丁,海龟就会停止他们的收集狂欢。因此,此代码产生的结果与collect仅调用一次自身以及收集调用自身三次或更多次时的结果相同。
这让我相信递归运行的if
条件可能会导致问题,因为将递归调用放在条件之外会起作用。 NetLogo似乎不以某种方式尊重递归。例如,如果在过程结束时在collect collect
行周围插入调试代码:
show "!"
collect
show "two"
collect
show "three"
]
show "four"
end
然后只有!
和four
打印到命令中心,但其他人从不执行。任何有关为什么这样工作的帮助将是有用的。看起来更像是bug而非功能。
答案 0 :(得分:0)
如果您点击没有MM的补丁,则没有递归调用,收集程序会移动海龟并结束。您的递归调用位于if子句的主体内,如果条件为false,则跳过它们。