My Mathematica(版本10.4和新版本11)在以下循环中崩溃:
count = 0;
findConnectedNodes[start_] := Module[{positions, i},
count++;
positions = adjmatrix[[start]] // ArrayRules // Keys;
positions = positions[[1 ;; -2]] // Flatten;
For[i = 1, i <= Length[positions], i++,
If[Not[MemberQ[connectedNodes, positions[[i]]]],
findConnectedNodes[positions[[i]]]];
AppendTo[connectedNodes, positions[[i]]];
connectedNodes = connectedNodes // DeleteDuplicates;
]
];
findConnectedAddresses[1];
变量adjmatrix是SparseArray,此代码用于查找邻接矩阵中的所有连接节点。
有趣的是,代码可以很好地工作到大约14'000“计数”(变量计数),之后Mathematica就崩溃了。
$ RecursionLimit设置为Infinity。
非常感谢你的帮助。此外,对代码的任何其他建议都非常感激。
答案 0 :(得分:0)
虽然您将变量$ RecursionLimit设置为无穷大,但所有编程语言都只能递归到那么多。如果我可以正确地假设,Mathematica编译器会抛出“堆栈溢出”错误,当当前本地“堆栈内存”溢出(或超过)最大堆栈内存大小时会发生这种错误。
根据我推断的内容,我建议在每次递归结束时强制/手动初始化Mathematica垃圾收集器,以销毁从先前递归创建的不需要的变量引用。如果您可以提供循环崩溃时给出的错误消息,我或其他人将能够为您提供更具建设性或基础的响应。
答案 1 :(得分:0)
非常感谢您提供的所有提示和想法。
我的解决方案是将找到的新节点添加到中间变量并循环该变量。通过这种方式,我没有去更深层次的&#34;进入循环并始终保持在一个水平。
如果有人有类似(或相同)的问题,我会写完整个代码。但是现在我希望&#34; text-version&#34;是不言自明的。