在Mathematica中使用for的递归函数不起作用

时间:2012-08-09 12:19:28

标签: recursion for-loop wolfram-mathematica

为什么这个递归函数不起作用?

代码:

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:回来!我:1
10:当前等级4
11:尝试:2
12:结束
13:回来!我:2
14:回来! I:3
15:回来!我:4
16:回来! I:5

Heeelp

在第14行,“i”应为= 2,当前级别:3并尝试:2 ..然后i = 1,然后i = 2 ..就像二叉树一样。

为什么会发生这种情况?!

2 个答案:

答案 0 :(得分: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]

这可以让您更容易看到正在发生的事情,但我认为当您 看到它正在做什么时,您需要重新构建代码。

答案 1 :(得分:0)

正如Chris所说,您需要在函数中本地化i,但我建议您使用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[...])定义的函数,或使用Function的{​​{1}}定义的函数(Slot)其中#可用于递归。我将为您说明这两种方法。

DownValues

#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用于表示函数本身。有关详情,请参阅Slot

#0