在T-SQL中创建递归存储过程以计算第n个斐波那契数
我在作业中提出了以下问题。我无法理解如何在存储过程中传递参数。 问题: 如果n=1,FibNuma,b,n=a 如果n=2,FibNuma,b,n=b 如果n>2,FibNuma,b,n=FibNuma,b,n-1+FibNuma,b,n-2a 在T-SQL中创建递归存储过程FibNum以计算第n个Fibonacci数,给定以下过程声明Create PROC FibNum@a int、@b int、@n int,其中其退出代码是第n个Fibonacci数。在T-SQL中创建递归存储过程以计算第n个斐波那契数,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我在作业中提出了以下问题。我无法理解如何在存储过程中传递参数。 问题: 如果n=1,FibNuma,b,n=a 如果n=2,FibNuma,b,n=b 如果n>2,FibNuma,b,n=FibNuma,b,n-1+FibNuma,b,n-2a 在T-SQL中创建递归存储过程FibNum以计算第n个Fibonacci数,给定以下过程声明Create PROC FibNum@a int、@b int、@n int,其中其退出代码是第n个Fibonacci数。 B利用存储过程计算FibNum1,1,
B利用存储过程计算FibNum1,1,10的结果。附上截图 这似乎是函数问题,但不是因为递归存储过程。实际上,您可以使用递归CTE来实现这一点 这样做的自然方式如下:
with fib as (
select 1 as i, 0 as n
union all
select 2 as i, 1 as n
union all
select f1.i + 1, f1.n + f2.n2
from fib f1 join
fib f2
where i < 10
)
select *
from fib;
如果您想要第n个数字,那么只需将10改为您想要的数字,并使用带有“订购人”的“选择顶部1”。过程
create proc FibNum ( @a int, @b int, @n int )
as begin
if @n = 1 return @a
if @n = 2 return @b
if @n > 2 begin
declare @n1 int = @n - 1, @n2 int = @n - 2, @R1 int, @R2 int
exec @R1 = FibNum @a,@b,@n1
exec @R2 = FibNum @a,@b,@n2
return @R1 + @R2
end
return 1
end
利用率:
declare @R int
exec @R = FibNum 1,1,10
select @R
看不出@a和@b的必要性,递归fibn只需参数n即可实现
CREATE PROC FibNum (@n INT)
AS
BEGIN
DECLARE @nminus1 INT, @nminus2 INT, @f1 INT, @f2 INT
IF @n < 2
RETURN @n
ELSE
SET @nminus1 = @n - 1
SET @nminus2 = @n - 2
EXEC @f1 = FibNum @nminus1
EXEC @f2 = FibNum @nminus2
RETURN @f1 + @f2
END
我必须为一项作业写这篇文章,我想我可以把它贴在这里
DECLARE @F0 BIGINT = 0
DECLARE @F1 BIGINT = 1
DECLARE @COUNTER BIGINT = 0
DECLARE @INTERIM BIGINT
WHILE @COUNTER < 1000
BEGIN
IF @F0 = 0 AND @F1 = 1
BEGIN
SELECT @F0 AS 'Fibo' INTO #fibonacci
INSERT INTO #fibonacci SELECT @F1
INSERT INTO #fibonacci SELECT @F0 + @F1
SET @INTERIM = @F0 + @F1
SET @F0 = @F1
SET @F1 = @INTERIM
SET @COUNTER += 1
END
ELSE
BEGIN
INSERT INTO #fibonacci SELECT @F0 + @F1
SET @INTERIM = @F0 + @F1
SET @F0 = @F1
SET @F1 = @INTERIM
SET @COUNTER += 1
END
END
SELECT * FROM #fibonacci
作业如果是,请将其标识为。这个答案会告诉你:变量@a和@b的可能重复是种子。并阅读以下过程声明CREATE PROC FibNum@a int、@b int、@n int给出的问题
DECLARE @F0 BIGINT = 0
DECLARE @F1 BIGINT = 1
DECLARE @COUNTER BIGINT = 0
DECLARE @INTERIM BIGINT
WHILE @COUNTER < 1000
BEGIN
IF @F0 = 0 AND @F1 = 1
BEGIN
SELECT @F0 AS 'Fibo' INTO #fibonacci
INSERT INTO #fibonacci SELECT @F1
INSERT INTO #fibonacci SELECT @F0 + @F1
SET @INTERIM = @F0 + @F1
SET @F0 = @F1
SET @F1 = @INTERIM
SET @COUNTER += 1
END
ELSE
BEGIN
INSERT INTO #fibonacci SELECT @F0 + @F1
SET @INTERIM = @F0 + @F1
SET @F0 = @F1
SET @F1 = @INTERIM
SET @COUNTER += 1
END
END
SELECT * FROM #fibonacci