Recursion “为什么?”;如果;似乎停止了NetLogo中的递归调用?

Recursion “为什么?”;如果;似乎停止了NetLogo中的递归调用?,recursion,netlogo,agent-based-modeling,Recursion,Netlogo,Agent Based Modeling,在NetLogo 5.x中处理递归过程的一个简单练习似乎产生了一个问题。该模型模拟海龟一次游荡一个斑块,并从斑块中收集M&M。我们的目标是使用递归过程调用,允许找到M&M的海龟获得两个额外的回合。这可以很容易地用一种非递归方法来完成,在这种方法中,我们使用一个变量来跟踪圈数。然而,在这种情况下,我们需要使用递归,而递归似乎会导致一个无法解释的问题: patches-own [MM] turtles-own [collection] to setup ;; observer ca ran

在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调用自身三次或更多次时相同

这使我相信运行递归的
if
条件可能是导致问题的原因,因为将递归调用放在条件之外会起作用。NetLogo似乎在某种程度上不尊重递归。例如,如果在过程末尾的
collect
行周围插入调试代码:

   show "!"
   collect
   show "two"
   collect
   show "three"
  ]
show "four"
end

那么只有
four
打印到命令中心,但其他的从未执行。任何关于为什么这样做的帮助都是有用的。看起来更像是一个bug,而不是一个特性。

如果你遇到一个没有MM的补丁,就没有递归调用,那么collect过程会移动海龟并结束。递归调用位于if子句的主体内,如果条件为false,则跳过它们。

如果遇到没有MM的修补程序,则没有递归调用,则collect过程移动海龟并结束。递归调用位于if子句的主体内,如果条件为false,则跳过它们。

我认为if可能会导致括号出现问题。解析器错误我认为IF可能会导致括号出现问题。解析器错误因此,如果海龟在其第一次
collect
中发现M&M,则应触发另外两个
collect
过程。如果这两种方法中的第一种不成功,海龟将不会立即执行第二种方法?你可以通过在代码中插入print语句并查看其行为来检验你的假设。看起来就像他在上面所做的那样。因此,如果海龟在第一次收集时发现M&M,这将触发另外两个
collect
过程。如果这两种方法中的第一种都不成功,海龟就不会立即实现第二种方法了?你可以自己在代码中插入print语句,看看它的行为如何,以此来检验你的假设。看起来就像他在上面做的那样。