日期:2014-05-16  浏览次数:20594 次

【例子】斐波纳契数列

斐波纳契数列
  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的存储过程了,一个简单的带返回参数的过程写的是磕磕绊绊,诶,需要温故知新了。

?

?

?