OCaml中for循环执行异常及二维数组更新不符预期问题
问题分析与解决
核心问题:数组引用共享
你的代码里create函数的实现存在致命问题:
let create m n = Array.make m (Array.make n 0)
Array.make n 0只会创建一个一维数组,Array.make m会把这个数组的引用重复m次存入外层数组。也就是说,你的二维数组s的所有行,本质上是同一个一维数组的引用。
导致的现象
- 数值翻倍增长:
update函数中i循环从0到Array.length s - 2(当传入参数3时,就是i=0和i=1),两次循环都会修改同一个一维数组的元素。如果update里是+2,每个元素会被加两次2,单次调用update实际增加值是4;若改为+1则每次加2——本质都是同一个元素被多次修改。 - 最后一行被更新:因为最后一行和前两行是同一个数组的引用,前两行的修改会直接同步到最后一行,看起来就像最后一行也被
update处理了。 - 误以为update被调用两次:实际上
while循环里update只被调用一次,但因为数组共享,两次i循环都修改同一个元素,导致数值变化看起来像是调用了两次update。
解决方案
修改create函数,确保每一行都是独立的一维数组,使用Array.init替代Array.make来创建外层数组:
let create m n = Array.init m (fun _ -> Array.make n 0)
Array.init会为每个索引调用一次传入的函数,每次调用都会创建一个新的Array.make n 0数组,这样二维数组的每一行都是独立的。
验证效果
修改后,调用update时:
i循环只会处理前两行(当m=3时),最后一行不会被修改- 每个元素只会被加一次(对应
update里的+1或+2),数值增长符合预期
内容的提问来源于stack exchange,提问作者Addem
相关产品推荐
相关产品推荐

