在朋友的一个SQL存储过程中看到有使用递归,回首想想貌似接触数据库这么久,还从来没有哪怕一次使用过。呵呵,有点小惭愧。于是研究了一下,试着写了一段SP来实现斐波纳契数列的计算。
斐波纳契数列
800年前,意大利的数学家斐波纳契出版了惊世之作《算盘书》。在《算盘书》里,他提出了著名的“兔子问题”:假定一对兔子每个月可以生一对兔子,而这对新兔子在出生
后第二个月就开始生另外一对兔子,这些兔子不会死去,那么一对兔子一年内能繁殖多少对兔子?
答案是一组非常特殊的数字:1,1,2,3,5,8,13,21,34,55,89……不难发现,从第三个数起,每个数都是前两数之和,这个数列则称为“斐波纳契数列”,其中每个数字都是“斐波纳契数”。
存储过程如下:
Create Procedure sp_Fibonacci
@Num Int,
@Out Int Output
As
Begin
Declare @A Int,@B Int,@OutA Int,@OutB Int
Select @A = @Num - 1,@B = @Num - 2
If @Num <= 0
Begin
Select @Out = NULL
End
Else
Begin
If @Num <= 2
Begin
Select @Out = 1
End
Else
Begin
Exec sp_Fibonacci @A,@OutA Output
Exec sp_Fibonacci @B,@OutB Output
Select @Out = @OutA + @OutB
End
End
Return
End
调用存储过程
Declare @A Int
Exec sp_Fibonacci 9,@A OutPut
Print @A
得到结果是:34
在@Num比较大的时候,会报错如下:
服务器: 消息 217,级别 16,状态 1,过程 sp_Fibonacci,行 21
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。
可见受到了嵌套层次的限制,而且在@Num比较大的时候执行效率也不怎么样,挺慢的。太久没有写SQL Server的存储过程了,一个简单的带返回参数的过程写的是磕磕绊绊,诶,需要温故知新了。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/62592/viewspace-1015609/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/62592/viewspace-1015609/