1

この再帰関数が機能しないのはなぜですか?

コード:

Clear[i];
Clear[v];
final= 4;

Recursion = Function[{v},
   For[i = 1, i <= 2, i++,
      Print["Current level ", v ];
      Print["Try: ", i];
      If[v == final,
         Print["End"];, 
         Recursion[v + 1]; (*else-case*)
      ];
      Print["Back! i:", i];
   ];
]

Recursion[1];

外:

0: 現在のレベル 1
1: トライ: 1
2: 現在のレベル 2
3: トライ: 1
4: 現在のレベル 3
5: トライ: 1
6: 現在のレベル 4
7: トライ: 1
8: 終了
9: 戻る! i:1
10: 現在のレベル 4
11: トライ: 2
12: 終了
13: 戻る! i:2
14: 帰ってきた!i:3
15: 帰ってきた!i:4
16: 帰ってきた!私:5

ヒールプ

14 行目で、"i" は =2、現在のレベル: 3、try: 2.. 次に i=1、次に i=2.. の二分木のようになります。

なぜこうなった?!

4

2 に答える 2

1

イテレータiは再帰内でインクリメントされているため、設定された制限の 2 を超えて 5 までカウントされます。

iの関数vを作成して、各再帰で個別に動作させることができます。つまり、

final = 4;
Recursion = Function[v,
   For[i[v] = 1, i[v] <= 2, i[v]++,
    Print["Current level ", v];
    Print["Try: ", i[v]];
    If[v == final, Print["End"], Recursion[v + 1]];
    Print["Back! i[", v, "]:", i[v]]]];
Recursion[1]

これにより、何が起こっているのかを簡単に確認できるようになりますが、コードが何をしているのかを確認するには、コードを再構築する必要があると思います.

于 2012-08-09T13:44:26.550 に答える
0

iChris が観察したように、関数内でローカライズする必要がありますが、使用Moduleしてローカライズすることをお勧めしますivはすでにそれ自体でローカライズされFunctionているため、必要ありませんClear。また、ユーザー関数名を大文字で始めることは避けてください。慣例により、大文字はシステム関数用に予約されています。

final = 4;

recursion =
  Function[{v},
   Module[{i},
    For[i = 1, i <= 2, i++,
     Print["Current level ", v];
     Print["Try: ", i];
     If[v == final, Print["End"], recursion[v + 1]];
     Print["Back! i:", i];
  ]]];

recursion[1];

これを超えて、問題は必要とされていないようでありFor、で書かれたほうがよいでしょうDo。また、別の構造を選択することもできます: DownValues(f[x_] := ...ではなくf = Function[...]) で定義された関数、または再帰に使用できるFunctionusing Slot( #)のいずれかです。#0両方の方法を説明します。

ダウン値

recursion2[v_Integer] :=
  Do[
   Print["Current level ", v];
   Print["Try: ", i];
   If[v == final, Print["End"], recursion2[v + 1]];
   Print["Back! i:", i],
   {i, 2}
  ]

純粋な機能Slot

ここで#( とも表記され#1ます) は、関数の単一のパラメーター#0を表し、関数自体を表すために使用されます。詳細については、を参照Slotしてください。

recursion3 =
 Do[
   Print["Current level ", #];
   Print["Try: ", i];
   If[# == final, Print["End"], #0[# + 1]];
   Print["Back! i:", i],
   {i, 2}
 ] &;
于 2012-08-12T07:23:08.800 に答える