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 構文に精通していないので、できる限り説明しようと思います。

このような線形再帰の場合 (つまり、一度に 1 つの再帰呼び出しのみ)、それを反復関数に変換する方法は、再帰スタイルの逆で考える必要があります。Nro から始めて 1 まで下げるのではなく、1 から始めて Nro まで上げることができます。

したがって、反復法でresultは、1 から始まります。次に、2 から Nro まで繰り返すことができます。各反復で、結果を 2 倍にしてから 1 を追加します。

ここに別の可能な視点があります。再帰的なスタイルでは、基本的にネストされた関数呼び出しの数が Nro になります。最も深いものが終了すると (つまり、Nro が 1 の場合)、次のものが終了し (Nro が 2 の場合)、次のものが終了し、元の呼び出しに戻るまで泡立ち続けます。反復法は、バブリング動作に従います (計算の順序に関する限り)。バブリングは 1 から始まります - 反復もそうです。バブリングも繰り返しと同じように Nro で終了します。

反復は、実際にはこの「バブリング」をまったく行わず、概念が相互に依存することもありません。しかし、少なくともこの移行を行っている間は、このように考えることが役立つかもしれません.

于 2011-03-16T04:30:14.427 に答える