为什么即使仅使用一种规则和一种表达式,Replace 和 ReplaceAll 也会给出不同的结果?

2024-03-28

也许有人可以向我解释为什么Replace给出了不同的答案ReplaceAll,即使我使用一条规则,并且我认为我有一种表达方式。

根据文档:

ReplaceAll looks at each part of expr, tries all the rules on it, and then goes on to 
the next part of expr. The first rule that applies to a particular part is used; no 
further rules are tried on that part, or on any of its subparts

和替换

A list of rules can be given. The rules are tried in order. The result of the first 
one that applies is returned. If none of the rules apply, the original expr is 
returned.

我有这样的表达:

z/(0.5 -1.4 z+z^2)

这一条规则

z -> Exp[I*w]

以下输入

Clear[z]
hz = z/(0.5 - 1.4 z + z^2);
Replace[hz, z -> Exp[I*w]]
ReplaceAll[hz, z -> Exp[I*w]]

产生这个结果:

z/(0.5 -1.4 z+z^2)                    (*from Replace*)
E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w))  (*from ReplaceAll*)

So, ReplaceAll做了我期望的工作,但没有Replace。我认为我在这里唯一缺少的就是表达式的 Parts 的组成部分。那么也许 hz 不是“一”表达式?好的,很好,但是它应该能够至少将规则应用到其中的一部分。但它没有在任何地方进行任何替换

FullForm[hz]
Times[z,Power[Plus[0.5`,Times[-1.4`,z],Power[z,2]],-1]]

hz 不是一种表达方式吗?如果不是的话,它有多少个零件?是生成的图末尾的叶子数吗TreeForm[hz]?如果是这样,那么我会在那里看到 3 个“z”,并且Replace[]那么应该更换其中之一

我一直用/.不假思索,这与ReplaceAll,但现在我用了Replace[]想法是一样的/.,我发现了这个并注意到了不同的功能。 (需要学习的功能太多,时间却很少:)


实际上,Replace and ReplaceAll are not相同。你可以想到Replace作为更精确的版本,因为Replace您可以在表达式中指定要进行替换的级别。这里的区别有点类似于Map and MapAll,除了微妙之处ReplaceAll不支持深度优先(见下文)。另一个差异也相当微妙,那就是Replace采取Heads选项,同时ReplaceAll不,这使得Replace但比ReplaceAll.

默认情况下,Replace works only在级别 0,即整个表达式。你的z然而更深层次的是:

In[220]:= Clear[z]
hz = z/(0.5 - 1.4 z + z^2);


Position[hz, z]

Out[222]= {{1}, {2, 1, 2, 2}, {2, 1, 3, 1}}

如果您使用级别规范Replace,您可以获得类似于但并不总是相同的效果ReplaceAll:

In[223]:= Replace[hz,z->Exp[I*w],{0,Infinity}]

Out[223]= E^(I w)/(0.5\[VeryThinSpace]-1.4 E^(I w)+E^(2 I w))

和...之间的不同Replace与 lev.spec{0,Infinity} and ReplaceAll前者在表达式之前执行深度优先、子表达式的操作,而后者则从较大的表达式到其部分进行操作。对此进行了更详细的讨论,例如here http://www.mathprogramming-intro.org/book/node218.html。利用这种差异为自己谋取优势的一个例子可以在this https://stackoverflow.com/questions/6562902/efficient-way-to-remove-empty-lists-from-lists/6563973#6563973 post.

回到默认行为Replace,它对整个表达式进行操作:当您只想转换整个表达式而不转换其任何部分(可能会意外地与规则中的模式匹配)时,它非常有用。这种应用的一个例子Replace is here https://stackoverflow.com/questions/6234701/how-to-block-symbols-without-evaluating-them/6236264#6236264.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么即使仅使用一种规则和一种表达式,Replace 和 ReplaceAll 也会给出不同的结果? 的相关文章

随机推荐