level 9
这一般叫memorization。
现定义f[x_]:=f[x]=Sin[x],并计算f[Pi]
据f的定义,第一步计算为f[Pi]=Sin[Pi]。
第二步,由于Set具有HoldFirst,跳过f[Pi]的计算,现在计算Sin[Pi]
据Sin定义,第三步计算为0。
对于0,无定义可执行,现在回到上一层(第二步),计算f[Pi]=0。对f[Pi]赋值并返回0。
对于返回的0,无定义可执行,回到最顶层,结束计算,最终返回0。
由于返回了0,所以这次计算的效果和f[x_]:=Sin[x]并无结果上的区别。
但下次执行f[Pi]时,会有两条定义适用,一是最早的f[x_]:>f[x]=Sin[x],二是上次计算过程中定义的f[Pi]=0。按语言设计,一般性较强的规则排序靠后,所以这里适用较为特殊的f[Pi]=0,仅一步就计算出0,而无需调用Sin。
2022年08月24日 15点08分