2015-09-18 160 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,它的工作很好。我感謝你在這裏爲我的查詢所花費的時間。 –