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 并尝试:2.. 然后 i=1,然后 i=2.. 就像二叉树一样。

为什么会这样?!

4

2 回答 2

1

您的迭代器i在递归内递增,这就是为什么它计数为 5,高于其设置的限制 2。

您可以创建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

正如 Chris 所说,您需要i在函数内进行本地化,但我建议您使用Moduleto localize ivFunction自行本地化,因此您不需要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(meaningf[x_] := ...而不是f = Function[...]) 定义的函数,或Functionusing Slot( #) where#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 回答