Mathematica中For循环内调用Tally函数无输出问题咨询
Mathematica For循环内语句无输出问题解决
问题复现
原有实现代码如下,循环体内编写的Tally[Sort[c]]执行时不会输出每次迭代的统计结果,仅在循环全部结束后单独调用Tally可得到最后一次迭代的统计值:
f[x] := -x + 1; g[x] := -x - 1; c = {g[0], f[0]} For[i = 1, i < 8, i++, a = Map[f, c]; b = Map[g, c]; c = Join[a, b]; Tally[Sort[c]]]
问题原因
Mathematica的For/Do/While这类循环结构默认不会自动回显循环体内表达式的求值结果,和单元格逐行输入代码自动输出运算结果的交互逻辑不同:循环内语句仅完成运算、赋值操作,不会主动将中间结果推送至前端展示。
解决方案
方案1:逐次迭代实时打印结果
用Print[]函数包裹需要输出的内容,即可在每次循环执行到对应语句时,把结果直接打印到笔记本界面,还可以附加迭代序号方便区分:
f[x] := -x + 1; g[x] := -x - 1; c = {g[0], f[0]}; (* 可选:打印初始集合的统计结果 *) Print["初始集合统计:", Tally[Sort[c]]]; For[i = 1, i < 8, i++, a = Map[f, c]; b = Map[g, c]; c = Join[a, b]; Print["第", i, "次迭代后集合统计:", Tally[Sort[c]]] ]
方案2:收集所有迭代结果统一处理
如果不需要实时打印,想把所有迭代的统计结果存下来做后续计算,可以用Sow/Reap组合收集结果,循环结束后一次性取出所有值:
f[x] := -x + 1; g[x] := -x - 1; c = {g[0], f[0]}; allTallyResults = Reap[ (* 收集初始值统计 *) Sow[Tally[Sort[c]], "初始值"]; For[i = 1, i < 8, i++, a = Map[f, c]; b = Map[g, c]; c = Join[a, b]; (* 每次迭代的统计值打上对应i的标签收集 *) Sow[Tally[Sort[c]], i] ] ][[2]]; (* 执行完成后直接调用allTallyResults即可查看所有轮次的统计结果 *)
内容的提问来源于stack exchange,提问作者Eman Awad
相关产品推荐
相关产品推荐

