在T-SQL中创建递归存储过程以计算第n个斐波那契数

在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,

我在作业中提出了以下问题。我无法理解如何在存储过程中传递参数。 问题:

如果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,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