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怎樣輸出時不換行?

其實看題主原來的代碼就很明顯:

Print[j, "*", i, "=", j i, "
"];

答案就是:把所有想要的輸出全順次放在Print這個函數里就行了。

再看題主的代碼,問題就是沒有把想輸出的東西全部放在Print中。

PS:

Mathematica編程不要用其他過程式語言的思路,尤其是少用For循環。


謝邀。第一次在知乎寫格式複雜的答案,編輯器不太會用,請諒解……

從「Mathematica 中使用傳統循環效率通常較低」[1,2]這一角度來看, @孫挺 的解法和匿名用戶的第一種解法都是比較好的。可能的解法很多,我在這裡再補充一種好了。

首先,這種表格樣式的輸出不那麼適合用 Print 函數,TableFormGrid 在這個問題中都是比較理想的格式函數。

其次,剛才說到,Mathematica 中的傳統循環語法效率較低,因此我們可以考慮換用別的(functional)方式生成二維數組和表格。TableArrayTuplesSparseArray、……都是可以考慮的函數。

SpareseArray 為例:

SparseArray[{
{i_, j_} /; i &>= j :&> (Defer[#1*#2 == #3] [i, j, i j])
},
{9, 9}, ""] // Grid // TraditionalForm

這裡,我們用 SparseArray 生成一個9	imes 9的方陣(二維數組),並在生成時約定了「規則」(Rule):對於任意第 i 行 第 j 列,如果 igeq j,則將該處元素置為 i	imes j = i j ,否則採用默認值""(即一個空字元串)。我們採用了 Defer 函數來保持 i	imes j = i j 的未計算形態(否則 #1*#2 會被計算並進而與 #3 比較最後得到邏輯值 True),但在之前先算出了右邊 ij 的值。最後我們用 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 |