为什么“if”似乎停止了NetLogo中的递归调用?

时间:2016-02-03 20:46:20

标签: recursion netlogo agent-based-modeling

在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而非功能。

1 个答案:

答案 0 :(得分:0)

如果您点击没有MM的补丁,则没有递归调用,收集程序会移动海龟并结束。您的递归调用位于if子句的主体内,如果条件为false,则跳过它们。