無意中在csdn上看到一帖有關繪製楊輝三角的sql表示式,感覺很有意思。後來自己想下不借助臨時表,根據楊輝三角的組合數計算方法c(n,m)=n!/[m!(n-m)!],進行繪製。
以下是完整的sql**:
use(【注】:當前指令碼在sql server 2012上測試通過tempdb
goset nocount on
declare
@rows
int=
10, --
行數,根據實際來控制
@xint
=1,@y
int=
1,@sql
nvarchar(max),@cols
int/*
根據楊輝三角的組合數計算方法:c(n,m)=n!/[m!(n-m)!]進行繪製
參照:*/set
@cols
=@rows*2
-1;with cte_n as
(
select r from (select row_number() over(order
by a.object_id) as r from sys.all_columns a ) x where r<=
@rows*2
),cte_1
as(select
n.r,b.data_lse
from
cte_n n
'select '+
stuff((select
',rtrim('+
isnull(f1.v+
'/((
'+f2.v+')*
'+f3.v+')
','''''') +
') as '+
quotename(isnull(nullif((m.r +(@rows
-n.r)+(m.r-
1)*1)%
@cols,0),@cols
))
from
cte_n m
stuff((select'*
'+rtrim(i.r) from cte_n i where i.r<=
isnull((nullif(n.r-
1,0)),1) for xml path('')),1,1,'') as
v ) f1
stuff((select'*
'+rtrim(i.r) from cte_n i where i.r<=
isnull((nullif(m.r-
1,0)),1) for xml path('')),1,1,'') as
v ) f2
stuff((select'*
'+rtrim(i.r) from cte_n i where i.r<=
isnull((nullif(n.r-m.r,0)),1) for xml path('')),1,1,'') as
v ) f3
where m.r<
@rows*2
order
byisnull(nullif((m.r +(@rows
-n.r)+(m.r-
1)*1)%
@cols,0),@cols) asc
for xml path(''
)
),1,1,'') as
data_lse
)bwhere n.r <=
@rows
)
select
@sql
=isnull(@sql+'
union all
','')+data_lse from
cte_1
exec(@sql)
)效果圖:
這方法雖然沒有借助臨時表,也有乙個最大的不足就是不能設定太多行,因為在公式(c(n,m)=n!/[m!(n-m)!])中有n! 和m! 算式,設定行數太多會導致階乘資料太大,發生資料型別轉換溢位。有時間再想辦法看能否從表示式中"/"除位置進行優化。
python楊輝三角 楊輝三角I II
給定乙個非負整數 numrows,生成楊輝三角的前 numrows 行。在楊輝三角中,每個數是它左上方和右上方的數的和。示例 輸入 5 輸出 1 1,1 1,2,1 1,3,3,1 1,4,6,4,1 可以一行一行錯位加,當然這裡提供更簡便的方法。任取一行描述 1,2,1 如何得到 1,3,3,1 ...
Java 楊輝三角
public class yanghui 生成指定行數的楊輝三角形 param lines 楊輝三角形的行數 public void printyanghui int lines if lines 30 int line new int lines int maxlen getmaxlen line...
輸出楊輝三角
程式的版權和版本宣告部分 檔名稱 fibnacci.cpp 作 者 單虹毓 完成日期 2013 年 12 月 4 日 版本號 v1.0 輸入描述 無 問題描述 楊輝三角 程式輸出 1 第0列和對角線上的元素都為1。程式輸出 2 除第0列和對角線上的元素以外,其它元素的值均為前一行上的同列元素和前一列...