dbj*_*ohn 6 arguments wolfram-mathematica function count
如何获取传递给函数的参数数量,例如Plus[2,3,4,5]传递给它的4个参数.我在想它可能涉及使用函数Length并将参数放入列表中.目的是基于函数的参数数量迭代操作.可能有一个简单的解决方案或功能,但我还没有遇到它.还欢迎任何其他方式或建议吗?
这是一种方式:
In[1]:= foo[args___] := Length[{args}]
In[2]:= foo[1,2,3,4]
Out[2]= 4
Run Code Online (Sandbox Code Playgroud)
当您定义这样的函数时,模式args___(具有3个尾随下划线)将匹配Sequence0或更多内容.您不能使用Length在Sequence和有什么明智的发生,所以你应该换args一个List(的{})第一.
但是,belisarius是正确的.对于许多迭代操作,使用内置的高阶函数(如Map和)会更容易,更有效Fold.
编辑添加:由于Mathematica表达式建立在边界检查数组之上,因此Length是O(1).这可能会让你相信它foo 也有O(1)的复杂性,但你会错的.由于模式匹配的工作方式,所有匹配的元素args将被复制到List您传递给的新元素中Length,从而使复杂度为O(N).这不一定是个大问题,因为使用带有函数的非常大的参数列表几乎总是意味着使用Apply,无论如何都会进行O(N)复制,但这是你应该知道的.
编辑再添加:还有另一种方法可以Length直接在被评估的表达式上使用(就像大多数Mathematica的面向列表的函数一样,Length可以用于任何头部的表达式,而不仅仅是列表).没有任何东西被复制,因为没有序列匹配并给出新的头部,并且计算其参数的函数不需要具有任何特殊属性,例如HoldAll.尽管如此,通过引入副作用实际上不属于副作用的方法来利用模式匹配机制中的怪癖是一种狡猾的黑客攻击,所以我会极其谨慎地使用它,如果有的话:
Module[{n},
expr : foo[___] /; (n = Length[Unevaluated[expr]]; True) :=
n]
Run Code Online (Sandbox Code Playgroud)
变量n可以是全局变量,但Module会创建(或至少做一个伪造的)词法闭包,因此您至少可以将变量保持为本地变量.