我对Mathematica对下列问题的答复感到困惑:
ClearAll[n]
#^2 & /@ Range[n]
#^2 & /@ Range[n] // StandardForm
看起来,就连数学(8.0)也不相信它刚才说的话:
#^2 & /@ Range[5]
Range[5^2]
对发生了什么事有什么想法吗?
编辑:
这一问题的最初背景如下。我写过
PrimeOmega[Range[n]] - PrimeNu[Range[n]]
由于n将非常大(2^50),我想我可以将其改写为:
PrimeOmega[#] - PrimeNu[#] &/@Range[n]
回想起来,这可能不是个好主意。(我本可以使用模块“计算”范围一次。)
发布于 2011-10-14 15:07:43
由于n
是未定义的,所以Range[n]
对自己进行了计算。因此,Map
和任何其他符号头一样作用于它,将您的函数映射到它的元素上这里就是n
。
In[11]:= #^2 & /@ someHead[n]
Out[11]= someHead[n^2]
编辑
在编辑中解决这个问题-对于数字n
,Range
可以计算为一个列表,并得到预期的结果(即Range[5]^2
)。这一切都是关于评价的顺序。要获得Range[5^2]
,可以使用#^2&/@Unevaluated[Range[5]]
,在这种情况下,一切都会发生,就像上面的符号n
一样)。实际上,Range
对非数字输入发出错误消息.而且,它与这个问题很接近,但是像#^2&
这样的函数是Listable
,您不必映射它们。
发布于 2011-10-14 16:49:47
稍微偏离主题,但是您可以通过重新定义FactorInteger来提高速度,然后每个输入只调用一次。
f1[n_] := PrimeOmega[Range[n]] - PrimeNu[Range[n]]
f2[n_] := With[{fax=FactorInteger[#]}, Total[fax[[All,2]]]-Length[fax]]& /@ Range[n]
示例:
In[27]:= Timing[pdiff1 = f1[2^20];]
Out[27]= {37.730264, Null}
In[28]:= Timing[pdiff2 = f2[2^20];]
Out[28]= {9.364576, Null}
In[29]:= pdiff1===pdiff2
Out[29]= True
丹尼尔·利希布鲁
https://stackoverflow.com/questions/7769613
复制相似问题