【问题标题】:Trouble using recursive function on list with Mathematica在 Mathematica 列表中使用递归函数时遇到问题
【发布时间】:2015-07-05 10:53:41
【问题描述】:

我正在尝试在 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 被覆盖有关,但我不知道如何解决这个问题....

谢谢!

【问题讨论】:

    标签: list recursion wolfram-mathematica


    【解决方案1】:

    你是对的,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]}]]]
    

    【讨论】:

    • 谢谢,我不知道模块!我还找到了解决问题的另一种方法,即删除循环Sum[f[res[[i]]], {i, 1, Length[res]}] 并简单地将其替换为Total[Map[f, res]]。再次感谢您的建议,有时它会对我有用!
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2011-02-15
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2022-01-15
    相关资源
    最近更新 更多