1

我制作了河内塔的这个递归函数,你必须在其中放置光盘的数量并返回移动的数量......它运作良好,但我想知道如何为此制作一个迭代函数......

这是我的功能...

Create function fnuHanoi (@Nro int)
returns int
as
begin
Declare @Result int
If @Nro = 1
Set @Result = 1
else
Set @Result = (((dbo.fnuHanoi(@Nro-1))*2)+1)
return @Result
end
go

我试过这样的东西......

Create function fnuHanoi (@Nro int)
returns int
as
begin
Declare @Discs int
Declare @i int
Set @Discs = 1
Set @i = 1
while (@Discs <= @Nro)
begin
    Set @i = (@i * 2) + 1       
end
return @i
end
go

很抱歉问这个问题,但我想更多地了解迭代函数和递归函数之间的区别以及何时使用一个而不是另一个更好......谢谢!

4

1 回答 1

3

我不熟悉 SQL 语法,所以我会尽力解释。

在像这样的线性递归情况下(即一次只有一个递归调用),将其转换为迭代函数的方式与递归风格相反。与其从 Nro 开始,然后逐步下降到 1,不如从 1 开始,逐步上升到 Nro。

所以在迭代方法中,result从 1 开始。然后你可以从 2 迭代到 Nro。在每次迭代中,将结果加倍,然后加一。

这是另一种可能的观点。在递归风格中,您基本上有 Nro 个嵌套函数调用。当最深的一个完成时(即当 Nro 为 1 时),下一个上一个可以完成(当 Nro 为 2 时),然后是下一个,它会继续冒泡,直到您回到最初的调用。迭代方法遵循冒泡行为(就计算顺序而言)。冒泡从 1 开始 - 迭代也是如此。冒泡也在 Nro 结束,就像迭代一样。

迭代实际上并没有做任何这种“冒泡”,这些概念也不会以任何方式相互依赖。但以这种方式开始可能会有所帮助,至少在您进行这种过渡时是这样。

于 2011-03-16T04:30:14.427 回答