2015-09-18 121 views
0

我在采访中被要求创建一个函数来计算一个数字的阶乘,该函数递归地调用自身。SQL 2008中的递归函数计算一个数的阶乘

我尝试这样做导致的错误消息:

“消息217,级别16,状态1,第1米的最大存储过程, 函数,触发器或视图的嵌套层数(限制32 )“。

下面是该查询:

CREATE FUNCTION fnGetFactorial (@num INT) 
RETURNS INT 
AS 
    BEGIN 
     DECLARE @result INT 
      , @n INT 

     WHILE (@num <> 1) 
      BEGIN 
       SELECT @n = dbo.fnGetFactorial(@num) 

       SELECT @result = @num * @n 

       SET @num = @num - 1 
      END 

     RETURN @result 
    END 

那么,是不是可以做一个类似的方式到我上面的代码,以最少的修改?我不想使用CTE。

+2

我不相信有最大的嵌套级别的方法。你为什么不想使用CTE? – JBond

+2

我认为proc的逻辑是有缺陷的 - 如果你通过了,比如说4,它会做的第一件事就是递归调用它自己,传入4 ....然后func首先递归调用自己传入4 ..等等。这就是为什么你要达到嵌套级别。如果你有另一个想法的函数的逻辑,以便它递归地调用自己正确(即如果你传入4,你应该只是旨在嵌套最深4层 - 真的,3看到你不需要乘以x1),那么你可以用一个函数来计算阶乘高达32! – PulseLab

+3

你有一个无限循环。当数字不为1时,它永远达不到'SET @num = @num - 1'。 – JodyT

回答

4
ALTER FUNCTION dbo.fnGetFactorial (@num int) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @n int 

    IF @num <= 1 SET @n = 1 
    ELSE SET @n = @num * dbo.fnGetFactorial(@num - 1) 

    RETURN @n 
END 
GO 
+0

请注意,数据类型应该是FLOAT。由于INT只允许阶乘达到12. BIGINT为20,FLOAT为32,因为它达到了递归限制。 – JBond

+0

谢谢@George Tanasie,它的工作很好。我感谢你在这里为我的查询所花费的时间。 –