使用Mathematica在列表上使用递归函数时遇到麻烦

时间:2015-07-05 10:53:42

标签: list recursion wolfram-mathematica

我正在尝试在Mathematica中编写一个递归函数,其参数是一个列表。如果列表的长度为1,则返回一个值。如果没有,该函数根据一些规则将其分解为几个较小的列表,然后在这些列表上评估该函数。这是我的代码:

f[u_] :=
 (Print["u : ", u];
  If[Length[u] == 1, 
   Subscript[T, u[[1]]] - Subscript[\[Lambda], 1]^u[[1]],
   v = SetPartitions[Length[u]];
   aux[v_] := Sum[u[[v[[i]]]], {i, 1, Length[v]}];
   res = Map[aux, v, {2}];
   res = Drop[res, -1];
   Print[res];
   Product[Subscript[T, u[[i]]], {i, 1, Length[u]}] - 
    Sum[f[res[[i]]], {i, 1, Length[res]}]]
  )

适用于

f[{1, 2}]

f[{3}]

但当列表长度为3或更长时,它不再起作用,例如

f[{1,1,2}].

以下是我收到的错误消息:

f[{1, 1, 2}]

u : {1,1,2}
{{4},{1,3},{2,2},{3,1}}
u : {4}
u : {1,3}
{{4}}
u : {4}

Part::partw: Part 3 of {{4}} does not exist. >>

u : {{4}}[[3]]
{{{{7}}}}
u : {{{7}}}

Part::partw: Part 4 of {{{{7}}}} does not exist. >>

u : {{{{7}}}}[[4]]
{{{{{{11}}}}}}
u : {{{{{11}}}}}

有谁知道该怎么办?我想它与被覆盖的变量 res 有关,但我不知道如何解决这个问题......

谢谢!

1 个答案:

答案 0 :(得分:0)

你是对的,res被覆盖了。解决方案是使用如下模块将res本地化到函数f的每次调用:

f[u_] := Module[{res},
  Print["u : ", u];
  If[Length[u] == 1, 
   Subscript[T, u[[1]]] - Subscript[\[Lambda], 1]^u[[1]], 
   v = SetPartitions[Length[u]];
   aux[v_] := Sum[u[[v[[i]]]], {i, 1, Length[v]}];
   res = Map[aux, v, {2}];
   res = Drop[res, -1];
   Print[res];
   Product[Subscript[T, u[[i]]], {i, 1, Length[u]}] - 
    Sum[f[res[[i]]], {i, 1, Length[res]}]]]