如何在T-SQL查询中不使用*符号计算给定数字的阶乘?
不用乘法符号实现T-SQL阶乘计算
没问题!要在T-SQL里避开*符号实现阶乘,核心思路是用重复累加模拟乘法——毕竟乘法本质就是相同数值的多次相加嘛。这里给你两种可行的实现方案:
方案一:嵌套循环累加模拟乘法
这种写法和你原来的循环逻辑结构接近,只是把乘法操作替换成了内层的累加循环:
DECLARE @given_number INT = 5; DECLARE @fact INT = 1; WHILE (@given_number > 1) BEGIN -- 用多次累加替代 @fact = @fact * @given_number DECLARE @temp INT = 0; DECLARE @counter INT = @given_number; WHILE (@counter > 0) BEGIN SET @temp = @temp + @fact; SET @counter = @counter - 1; END SET @fact = @temp; SET @given_number = @given_number - 1; END SELECT @fact AS 'Factorial is ';
逻辑说明:
- 外层循环保持你原有的阶乘迭代逻辑,每次处理当前的递减数字
- 内层循环通过将
@fact累加@given_number次,得到等价于@fact * @given_number的结果,完全避开乘法符号
方案二:递归CTE+累加实现
如果你更喜欢声明式的写法,可以用递归CTE结合SUM和TOP来模拟乘法:
DECLARE @given_number INT = 5; WITH FactorialCTE AS ( -- 递归起始点:1的阶乘为1 SELECT 1 AS current_num, 1 AS fact_value UNION ALL SELECT current_num + 1, -- 通过SUM+TOP累加fact_value共(current_num+1)次,模拟乘法 (SELECT SUM(fact_value) FROM (SELECT TOP (current_num + 1) fact_value FROM FactorialCTE) AS t) FROM FactorialCTE WHERE current_num < @given_number ) SELECT fact_value AS 'Factorial is ' FROM FactorialCTE WHERE current_num = @given_number;
逻辑说明:
- 递归CTE从
1!开始,每次迭代计算下一个数字的阶乘 - 用
TOP (current_num + 1)取出当前阶乘值current_num+1次,再求和,等价于fact_value * (current_num + 1)
注意事项:
如果需要计算较大数字的阶乘,建议把INT换成BIGINT类型,避免数值溢出问题。
内容的提问来源于stack exchange,提问作者Sohail Akhter
相关产品推荐
相关产品推荐

