Recursion “为什么?”;如果;似乎停止了NetLogo中的递归调用?
在NetLogo 5.x中处理递归过程的一个简单练习似乎产生了一个问题。该模型模拟海龟一次游荡一个斑块,并从斑块中收集M&M。我们的目标是使用递归过程调用,允许找到M&M的海龟获得两个额外的回合。这可以很容易地用一种非递归方法来完成,在这种方法中,我们使用一个变量来跟踪圈数。然而,在这种情况下,我们需要使用递归,而递归似乎会导致一个无法解释的问题: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
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语句,看看它的行为如何,以此来检验你的假设。看起来就像他在上面做的那样。