--以4阶为例
--详情请参考https://blog.csdn.net/weixin_46664967/article/details/113621821
DECLARE @n INT=4
DECLARE @i INT =1
DECLARE @r VARCHAR(4000)
DECLARE @lx INT
DECLARE @v INT
DECLARE @rst INT =0
--建数组
CREATE TABLE #tmp
(
i INT,
j INT,
v INT
)
INSERT INTO #tmp VALUES(1,1,3),(1,2,1),(1,3,1),(1,4,1)
INSERT INTO #tmp VALUES(2,1,1),(2,2,3),(2,3,1),(2,4,1)
INSERT INTO #tmp VALUES(3,1,1),(3,2,1),(3,3,3),(3,4,1)
INSERT INTO #tmp VALUES(4,1,1),(4,2,1),(4,3,1),(4,4,3)
--全排列
CREATE TABLE #rst
(
i INT,
n INT,
r VARCHAR(4000)
)
INSERT INTO #rst
SELECT 1,number,CONVERT(VARCHAR(4000),number) AS r
FROM master..spt_values WHERE type='p' AND number BETWEEN 1 AND @n
WHILE @i<=@n
BEGIN
INSERT INTO #rst
SELECT @i+1,number,a.r+','+CONVERT(VARCHAR(4000),b.number) FROM #rst a
CROSS JOIN
(
SELECT CONVERT(VARCHAR(10),number) AS number
FROM master..spt_values WHERE type='p' AND number BETWEEN 1 AND @n
) b
WHERE CHARINDEX(b.number,a.r)=0 AND i=@i
SET @i=@i+1
END
SELECT IDENTITY(INT,1,1) AS i, r INTO #rst2
FROM #rst WHERE i=@n
SET @n=@@ROWCOUNT
--计算
SET @i=1
WHILE @i<=@n
BEGIN
SELECT @r=r FROM #rst2 WHERE i=@i
SET @lx=0
--逆序数
;WITH ct
AS
(
SELECT * from dbo.f_Split(@r,',')
)
SELECT @lx=COUNT(1) FROM ct m,ct n
WHERE m.id>n.id
AND m.value<n.value
--累计
SET @v=1
SELECT @v=@v*v FROM #tmp a INNER JOIN dbo.f_Split(@r,',') b ON a.i= b.id AND a.j=b.value
SET @rst =@rst+POWER(-1,@lx)* @v
SET @i=@i+1
END
SELECT @rst
DROP TABLE #rst
DROP TABLE #rst2
DROP TABLE #tmp
逆序数法计算N阶行列式的值
于 2024-10-29 11:21:48 首次发布
1150

被折叠的 条评论
为什么被折叠?



