通过SQL绘制杨辉三角的实现方法介绍_MsSql

无意中在csdn上看到一帖有关绘制杨辉三角的sql表达式,感觉很有意思。后来自己想下不借助临时表,根据杨辉三角的组合数计算方法C(n,m)=n!/[m!(n-m)!],进行绘制。

以下是完整的SQL代码:

复制代码 代码如下:

use tempdb
go
set nocount on
declare @rows int=10, --行数,根据实际来控制
        @x int=1,@y int=1,@sql nvarchar(max),@cols int

/*
根据杨辉三角的组合数计算方法:C(n,m)=n!/[m!(n-m)!]进行绘制
参照:http://baike.baidu.com/view/7804.htm
*/

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
                cross apply(select '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
                                    outer apply(select 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
                                    outer apply(select 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
                                    outer apply(select 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 by isnull(nullif((m.r +(@rows-n.r)+(m.r-1)*1)%@cols,0),@cols) asc
                                for xml path('')                                   
                                ),1,1,'') as data_lse
                            )b
                where 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! 算式,设置行数太多会导致阶乘数据太大,发生数据类型转换溢出。有时间再想办法看能否从表示式中"/"除位置进行优化

时间: 2024-09-15 04:14:03

通过SQL绘制杨辉三角的实现方法介绍_MsSql的相关文章

关于杨辉三角的题目

问题描述 杨辉三角的解答网上一堆答案,可是看到这种填空题我瞬间无语了,求高手解答.usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceExample_05_04{classYangHuiTrangle{privateint[][]trangle;publicintRow{set{//计算三角形数组中值}get{return0;}}///<summary>///获取杨辉三角的

用Javascript打印杨辉三角

var arr = new Array(); for(var i = 0 ;i < 6 ; i++){ if(i == 0){arr.push(1);} else if(i == 1){arr = new Array();arr.push(1);arr.push(1);} else{ var arr2 = new Array(); arr2.push(1); for(var j = 0;j<arr.length - 1; j++){arr2.push(arr[j] + arr[j+1]);}

C语言小程序 杨辉三角示例代码

输入要显示的杨辉三角的行数,会打印出金字塔型的杨辉三角,不过行数太多的话,效果不太好,可以再调整一下格式控制   复制代码 代码如下: #include <stdio.h> #include <stdlib.h> int main() {  int i,j,k;  int line;  int *prev, *next;  printf("输入要查看杨辉三角的行数(大于2):");  scanf("%d",&line);  if(li

批处理杨辉三角效果实现代码

 这篇文章主要介绍了批处理打印彩色的杨辉三角效果实现代码,喜欢的朋友可以测试下 效果图:   代码如下: @echo off&color 0e setlocal enabledelayedexpansion mode con: cols=130 lines=130 :top cls ::set /p in=请输入行数: set in=23&set ab=1&set var=64 if "%in%"=="" goto top if %in% g

c语言-杨辉三角等腰三角形求解

问题描述 杨辉三角等腰三角形求解 #include#include#define OK 1#define ERROR -1#define OVERFLOW -2#define MAXQSIZE 100 typedef int Status;typedef struct{ int *base; int front; int rear;}SqQueue; Status InitQueue(SqQueue &Q){ Q.base=(int *)malloc(MAXQSIZE*sizeof(int));

我是刚学的大一生 这道我自己编的杨辉三角问题 但不知道错那里 请高手帮忙 ,谢谢

问题描述 int[,]a=newint[6,6];privatevoidbutton1_Click(objectsender,EventArgse){inti,j;for(i=1;i<7;i++)a[i,i]=1;a[i,1]=1;for(i=3;i<7;i++)for(j=2;j<i;i++){a[i,j]=a[i-1,j]+a[i-1,j-1];}for(i=1;i<7;i++)for(j=1;j<i+1;j++)label1.Text+=a[i,j]+"&qu

庞果网之杨辉三角的变形

题目详情          1      1   1  1   1  2   3  2  1 1  3  6   7  6  3  1 以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等3个数之和(如果不存在某个数,认为该数就是0). 求第n行第一个偶数出现的位置.如果没有偶数,则输出-1.例如输入3,则输出2,输入4则输出3. 输入n(n <= 1000000000) [解析] 经过分析得出的结论如下: 1.前两行没有偶数可直接返回-1 2.一下每

c#-以C#打印输出杨辉三角如何对齐?

问题描述 以C#打印输出杨辉三角如何对齐? 试了好多次也没有成功输出可以对齐的!不知道那一堆代码应该写在哪? 解决方案 多想想 解决方案二: 这只是1位数字,要是2位,三位,更多呢,自己研究研究吧

c语言-杨辉三角(我是新手,详细点哈)

问题描述 杨辉三角(我是新手,详细点哈) 用C打印出7行杨辉三角!成塔装的那种!(我是新手,求注解) 解决方案 #include <stdio.h>#define N 7int main(){ int a[N][N]; int i=0j=0; for(i=0;i<N;i++) a[i][0]=a[i][i]=1; for(i=2;i<N;i++) for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<N;i+