我对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
复制相似问题