通過SQL繪製楊輝三角

2022-01-30 08:03:33 字數 2275 閱讀 1953

無意中在csdn上看到一帖有關繪製楊輝三角的sql表示式,感覺很有意思。後來自己想下不借助臨時表,根據楊輝三角的組合數計算方法c(n,m)=n!/[m!(n-m)!],進行繪製。

以下是完整的sql**:

use

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)

(【注】:當前指令碼在sql server 2012上測試通過

)效果圖:

這方法雖然沒有借助臨時表,也有乙個最大的不足就是不能設定太多行,因為在公式(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列和對角線上的元素以外,其它元素的值均為前一行上的同列元素和前一列...