Dav*_*idC 3 wolfram-mathematica range
我对Mathematica对以下内容的回答感到困惑:
ClearAll[n]
#^2 & /@ Range[n]
#^2 & /@ Range[n] // StandardForm
Run Code Online (Sandbox Code Playgroud)

似乎即使Mathematica(8.0)也不相信它刚才所说的:
#^2 & /@ Range[5]
Range[5^2]
Run Code Online (Sandbox Code Playgroud)

关于发生了什么的任何想法?
编辑:
这个问题的原始背景如下.我写过
PrimeOmega[Range[n]] - PrimeNu[Range[n]]
Run Code Online (Sandbox Code Playgroud)
因为n会非常大(2 ^ 50),我想我可以通过重写它来节省时间:
PrimeOmega[#] - PrimeNu[#] &/@Range[n]
Run Code Online (Sandbox Code Playgroud)
回想一下,这可能不是一个好主意.(我本来可以用Module来'计算'Range只一次.)
Leo*_*rin 15
由于n未定义,因此Range[n]对其自身进行评估.因此,Map就像在任何其他符号头上一样对它进行操作,将你的函数映射到它的元素 - 这就是它n
In[11]:= #^2 & /@ someHead[n]
Out[11]= someHead[n^2]
Run Code Online (Sandbox Code Playgroud)
编辑
在编辑中解决问题 - 对于数字n,Range可以正确评估列表,并获得预期结果(即,Range[5]^2所有关于评估的顺序.要获得Range[5^2],您可以使用#^2&/@Unevaluated[Range[5]],在这种情况下,一切都会发生就像n上面的符号一样).实际上,Range在非数字输入上发出错误消息.此外,它是相切的问题,但像功能#^2&是Listable,你不必映射.
稍微偏离主题,但您可以通过重新定义FactorInteger来提高速度,然后每个输入只调用一次.
f1[n_] := PrimeOmega[Range[n]] - PrimeNu[Range[n]]
f2[n_] := With[{fax=FactorInteger[#]}, Total[fax[[All,2]]]-Length[fax]]& /@ Range[n]
Run Code Online (Sandbox Code Playgroud)
例:
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
Run Code Online (Sandbox Code Playgroud)
Daniel Lichtblau