为什么这个递归函数不起作用?
代码:
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 ..就像二叉树一样。
为什么会发生这种情况?!
答案 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
来本地化i
。 v
本身已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
)其中#
可用于递归。我将为您说明这两种方法。
#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