var nums = Enumerable.Range( 1, 9 ); var result = from x in nums from y in nums select$"{x} * {y} = {x * y}"; result.ToList().ForEach( x => Console.WriteLine(x));
後來想到這樣寫成直式好像也滿直覺的
1 2 3 4 5 6 7 8 9
var nums = Enumerable.Range( 1, 9 ); var result = from x in nums from y in nums select $@" {y.ToString( ).PadLeft( 4 )}" + Environment.NewLine + $@"x {x.ToString( ).PadLeft( 4 )}" + Environment.NewLine + $@"------" + Environment.NewLine + $@" {(x * y).ToString( ).PadLeft( 4 )}" + Environment.NewLine; result.ToList().ForEach( x => Console.WriteLine(x));
這裡還有很噁爛的 SelectMany 寫法 , 想要詳細知道 linq 可以看這個微軟 mvp 大神的 blog , 應該是講解 linq 最細的 blog
1 2 3 4 5 6
var num = Enumerable.Range(1, 9); var result = num.SelectMany( x => num, (x, y) => $"{x} * {y} = {x * y}" ); result.ToList().ForEach(x => Console.WriteLine(x));
sql server
而 SQL 採用集合做為思考,一般都會使用 UNION ALL 搭配遞迴與 CROSS JOIN 進行計算,大概會長得像下面這樣
WITH TALLY(N) AS ( SELECT1 UNIONALL SELECT2 UNIONALL SELECT3 UNIONALL SELECT4 UNIONALL SELECT5 UNIONALL SELECT6 UNIONALL SELECT7 UNIONALL SELECT8 UNIONALL SELECT9 ) SELECTCAST(A.N ASvarchar) + '*' + CAST(B.N ASvarchar) + '=' + CAST(A.N * B.N ASvarchar) FROM Tally A CROSSJOIN Tally B
--使用遞迴(RECURSIVE) WITH TALLY(N) AS ( SELECT1 N UNIONALL SELECT1 + N FROM Tally WHERE N < 9 ) SELECTCAST(A.N ASvarchar) + '*' + CAST(B.N ASvarchar) + '=' + CAST(A.N * B.N ASvarchar) FROM Tally A CROSSJOIN Tally B
WITH TALLY AS( SELECT * FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9) ) T(N) ) SELECTCAST(A.N ASvarchar) + '*' + CAST(B.N ASvarchar) + '=' + CAST(A.N * B.N ASvarchar) FROM TALLY A CROSSJOIN TALLY B
如果是 sql server 2016 可以用 string_split
1 2 3 4 5 6 7
with cte(n) as ( select cast(value as int) as n from string_split('1,2,3,4,5,6,7,8,9' , ',') ) select x.n , '*' as '*' , y.n , '=' as '=' , (x.n * y.n) result from cte x cross join cte y
--使用generate_series select a , b , a || '*' || b || '=' || a * b asresult from generate_series(1,9) a , generate_series(1,9) b orderby casewhen a >= 7then a else -a enddesc , b asc;
--使用array elect a , b , a || '*' || b || '=' || a * b as result from unnest(array[1,2,3,4,5,6,7,8,9]) a , unnest(array[1,2,3,4,5,6,7,8,9]) b order by case when a >= 7 then a else -a end desc , b asc;
WITH TALLY AS ( SELECT 1 N FROM DUAL UNION ALL SELECT 2 N FROM DUAL UNION ALL SELECT 3 N FROM DUAL UNION ALL SELECT 4 N FROM DUAL UNION ALL SELECT 5 N FROM DUAL UNION ALL SELECT 6 N FROM DUAL UNION ALL SELECT 7 N FROM DUAL UNION ALL SELECT 8 N FROM DUAL UNION ALL SELECT 9 N FROM DUAL ) SELECT CASE WHEN MOD(X.N , 2) = 0 THEN '<html><font color="red">' || X.N || '*' || Y.N || '=' || X.N * Y.N ELSE X.N || '*' || Y.N || '=' || X.N * Y.N END NINENINE FROM TALLY X CROSS JOIN TALLY Y
python
最近搞 python , 來個單迴圈
1 2 3 4 5 6 7 8 9 10
i = 1 j = 1
while j <= 9: print(f"{i} * {j} = {i * j}") if i == 9: j += 1 i = 1 else: i += 1
反人類遞迴 python
1 2 3 4 5 6 7 8 9 10 11 12
def test(i, j): if j <= 9: print(f"{i} * {j} = {i * j}") if i == 9: j += 1 i = 1 else: i += 1
test(i, j)
test(1,1)
js
1 2 3 4 5 6 7 8 9
for (var i = 1, j = 1; j <= 9;){ console.log(`${i} * ${j} = ${i * j}`) if (i == 9) { i = 1 j += 1 } else { i += 1 } }
雙重遞迴 , 關鍵是在 N 裡面再多包一個 M 的遞迴 首先當數字小於 10 時會不斷印出來 , 當數字執行到 10 的時候會 return 接著再回到 N 開始往下個數字疊加下去 , 此時 m 已經歸零又重新進入 M 的遞迴 有趣的是拿這串 code 去問 chatgpt 問他這串作用是啥 , 他竟然可以回出 99 乘法表 , 真是太噁心了