我做了河内塔的这个递归功能,你必须把光盘的数量和它返回运动的数量...它运作良好,但我想知道如何为此做一个迭代函数.. 。
这是我的功能......
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
我很抱歉这个问题,但我想更多地了解迭代和递归函数之间的区别,何时更好地使用一个而不是另一个...谢谢!!!
答案 0 :(得分:3)
我不熟悉SQL语法,所以我会尽量尽力解释。
在像这样的线性递归情况下(即一次只有一次递归调用),将其转换为迭代函数的方式,它以递归样式的反向思考。而不是从Nro开始,一路走到1,你可以从1开始,然后一直到Nro。
所以在迭代方法中,result
从1开始。然后你可以从2迭代到Nro。在每次迭代中,您将结果加倍,然后添加一个。
这是另一种可能的观点。在递归样式中,您基本上有Nro个嵌套函数调用。当最深的一个完成时(即当Nro为1时),那么下一个可以完成(当Nro为2时),然后是下一个,并且它继续冒泡直到你回到原始调用。迭代方法遵循冒泡行为(就计算顺序而言)。冒泡从1开始 - 迭代也是如此。冒泡也在Nro完成,就像迭代一样。
迭代实际上并没有做任何“冒泡”,概念也不以任何方式相互依赖。但是,至少在你进行这种转变的过程中,开始思考这种方式可能会有所帮助。