代码之家  ›  专栏  ›  技术社区  ›  Yaroslav Bulatov

在Mathematica中编程创建多元函数

  •  1
  • Yaroslav Bulatov  · 技术社区  · 14 年前

    这是对 earlier

    假设我需要定义一个函数f来检查给定的图的标记是否是正确的颜色。换句话说,我们给每个节点分配了一个整数,没有两个相邻的节点得到相同的答案。例如,对于{“Path”,3},f[{1,2,3}]返回True,f[{1,1,2}]返回False。我如何为任意图创建这样的函数?

    下面的代码基本上满足了我的需求,但是生成了部分警告。

    g[edges_] := Function @@ {{x}, And @@ (x[[First[#]]] != x[[Last[#]]] & /@ edges)}
    f = g[GraphData[{"Path", 3}, "EdgeIndices"]];
    f[{1, 2, 1}]==False
    

    这是我经常遇到的一个玩具实例问题——我需要以编程的方式创建一个多元函数f,结果要么是1)部分警告2)将g的求值推迟到f的求值

    3 回复  |  直到 8 年前
        1
  •  1
  •   Michael Pilat    14 年前

    这里有些东西。当别的都不起作用的时候, Hold 规则通常可以完成任务。我不确定它是否产生了正确的结果w.r.t.你的图着色问题,但希望能给你一个起点。我最后用 Slot x$ 与。 x

    g[edges_] := 
     With[{ors = (Hold @@ edges) /. {a_, b_} :> #[[a]] == #[[b]]},
      Function[!ors] /. Hold -> Or
      ]
    
    In[90]:= f = g[GraphData[{"Path", 3}, "EdgeIndices"]]
    Out[90]= !(#1[[1]] == #1[[2]] || #1[[2]] == #1[[3]]) &
    
    In[91]:= f[{1, 2, 3}]
    Out[91]= True
    
    In[92]:= f[{1, 1, 2}]
    Out[92]= False
    

    我觉得它缺乏典型的数学家的优雅,但它是有效的。我会更新,如果我的灵感与更美丽的东西。

        2
  •  1
  •   Pillsy    14 年前

    对于这类问题,有两种其他的解决方案不需要您使用 Hold ReleaseHold Function 已经有了 HoldAll 属性。你首先在本地“删除” Part Block ,所以您感兴趣的表达式可以安全地构造,然后使用 With 把它插入 功能 然后可以安全地从 ,还使用了以下事实 Slot 功能

    用你的例子:

    coloringChecker[edges_List] := 
     Block[{Part},
      With[{body = And @@ Table[#[[First@edge]] != #[[Last@edge]], {edge, edges}]},
       body &]]
    

    保持

        3
  •  0
  •   High Performance Mark    14 年前

    我仍然对你似乎遇到的困难感到困惑。下面是一个函数,它检查列表中没有两个连续的元素是相同的:

    f[l_List] := Length[Split[l]] == Length[l]
    

    部分没有问题,对于我迄今为止尝试过的简单示例,包括OP的“test”用例,没有错误消息。我还认为,这比迄今为止看到的任何一种方法都更简洁、可读性更强。