Mathematica中的Print怎麼能輸出時不換行?
比如輸出乘法表,不希望第一個Print換行的
Module[{i, j},
For[i = 1, i &<= 9, i++, For[j = 1, j &<= i, j++, Print[j, "*", i, "=", j i, " "]; ]; Print[]; ]; ];
首先,題主想要的效果是這個吧?
(Print @@ Flatten[Riffle[#, " "]]) /@
Table[{j, "*", i, "=", j i}, {i, 9}, {j, i}];
其實看題主原來的代碼就很明顯:
Print[j, "*", i, "=", j i, "
"];
答案就是:把所有想要的輸出全順次放在Print這個函數里就行了。
再看題主的代碼,問題就是沒有把想輸出的東西全部放在Print中。
PS:Mathematica編程不要用其他過程式語言的思路,尤其是少用For循環。謝邀。第一次在知乎寫格式複雜的答案,編輯器不太會用,請諒解……
從「Mathematica 中使用傳統循環效率通常較低」[1,2]這一角度來看, @孫挺 的解法和匿名用戶的第一種解法都是比較好的。可能的解法很多,我在這裡再補充一種好了。
首先,這種表格樣式的輸出不那麼適合用 Print 函數,TableForm 和 Grid 在這個問題中都是比較理想的格式函數。
其次,剛才說到,Mathematica 中的傳統循環語法效率較低,因此我們可以考慮換用別的(functional)方式生成二維數組和表格。Table、Array、Tuples、SparseArray、……都是可以考慮的函數。
以 SpareseArray 為例:SparseArray[{
{i_, j_} /; i &>= j :&> (Defer[#1*#2 == #3] [i, j, i j])
},
{9, 9}, ""] // Grid // TraditionalForm
補充一點:
Print 輸出的時候並非產生了「換行」,而是產生了一個新的 Cell,下一個 Print 又產生一個新的 Cell,自然就不在同一行了。而同一個 Cell 內則是可以換行的(用"",用表格格式,……)。
參考文獻:
[1] Programs using loops are often inefficient in Mathematica[2] Are there any cases when For[] loops are reasonable?按照@孫挺的思路,還可以這樣寫
Print @@@ Table[Row@{j, "*", i, "=", j i, " "}, {i, 9}, {j, i}];
Print @@@ Join @@@ Table[{j, "*", i, "=", j i, " "}, {i, 9}, {j, i}];
如果用雙重循環的話建議用Do代替For,
Do[
Do[
WriteString["stdout", j, "*", i, "=", j i, " "], {j, i}
];
WriteString["stdout", "
"], {i, 9}
]
如果不用Print和WriteString的話,只是為了輸出乘法表,還可以更簡單
Grid@Table[Row@{j, "*", i, "=", j i, " "}, {i, 9}, {j, i}]
推薦閱讀:
※如何看待工科生因為現在數學軟體太強了,進而對數學不重視的觀念?
※為什麼在 Mathematica 中使用循環是低效的?
※Mathematica如何導入某個csv或者excel文件的指定行和列?
※Mathematica 終究不是 Lisp?
TAG:數學 | 編程 | WolframMathematica |