使用 Mathematica 在列表上使用递归函数时遇到问题
Trouble using recursive function on list with Mathematica
我正在尝试在 Mathematica 中编写一个递归函数,它的参数是一个列表。如果列表的长度为 1,则它 returns 是一个值。如果不是,该函数将根据一些规则将其分解为几个较小的列表,然后在这些列表上评估该函数。这是我的代码:
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 被覆盖有关,但我不知道如何解决这个问题....
谢谢!
你是对的,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]}]]]
我正在尝试在 Mathematica 中编写一个递归函数,它的参数是一个列表。如果列表的长度为 1,则它 returns 是一个值。如果不是,该函数将根据一些规则将其分解为几个较小的列表,然后在这些列表上评估该函数。这是我的代码:
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 被覆盖有关,但我不知道如何解决这个问题....
谢谢!
你是对的,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]}]]]