无限迭代的问题
mathematica吧
全部回复
仅看楼主
level 6
twototoo222 楼主
谁能告诉我,为什么写g[x] := g[x]个式子,在计算g[x]的时候不会无限循环,而在f[x_] := f[x]中,计算f[x]时就会无限循环呢?
为什么这么写,SetAttributes[k, Flat];k[x_] := x,然后计算k[x]就会无限迭代,
而这么写k[x_] := x;SetAttributes[k, Flat],两个计算下位置,然后再计算k[x]就不迭代了呢?应该是和OneIdentity属性有关,但是和顺序有什么关系?
在Trace[x -> 2, TraceOriginal -> True]的时候,返回结果{x->2,{Rule},{x},{2},x->2,x->2,{Rule},{x},{2},x->2},在已经得到x—>2的返回结果的时候,为什么还要再计算一遍呢?
2013年04月25日 02点04分 1
吧务
level 15
……等级略高。强烈建议上Stackexchange问问。
2013年04月25日 03点04分 2
那是什么?
2013年04月25日 07点04分
回复 twototoo222 :置顶里有……唉算了:http://mathematica.stackexchange.com/
2013年04月25日 07点04分
level 6
twototoo222 楼主
还要,为什么
f[a, b, c] /. f[x_Sequence] -> p[x]
f[a, b, c] /. f[Sequence[x__]] -> p[x]
下面的可以匹配,上面的不可以呢?
2013年04月25日 04点04分 3
有Sequence这个头部的吗?貌似没见过的说。
2013年04月25日 05点04分
回复 云梦南123 :应该有啊,比如f[x]的头部是f,那Sequence[a,b,c]的头部应该是Sequence吧
2013年04月25日 07点04分
level 10
对于第一个问题:
我发现只要延时赋值的两边是完全一样的,就不会发生无限计算。比如:
In[]:= x:=x;
x
就没事。但是:
In[]:= x:=(1;x);
x
就会出现无限计算。不知道是怎么回事。。。
2013年04月25日 05点04分 4
不知道标准计算序列里面说的表达式在计算过程中改变指的是什么,是指表达式形式发生改变了,还是调用规则对其变换了就算改变。
2013年04月25日 07点04分
level 10
2013年04月25日 06点04分 5
所以第二个例子里的Sequence没起作用。。。Sequence在外围有中括号的时候会被压平,除非外围的表达式有SequenceHold属性。
2013年04月25日 06点04分
Rule有SequenceHold属性,所以f[Sequence[a, b, c]] /. Sequence[x__] -> p[x]可以。。。
2013年04月25日 06点04分
就连HoldPattern也没有SequenceHold属性!
2013年04月25日 06点04分
回复 mm_酱 :哦,是的,当时就是第二个不明白,第一个不可以匹配我理解,但是乍一看第一个和第二个一样,所以我就不明白了。原来是第二个里的Sequence被率先压平了,谢谢
2013年04月25日 07点04分
level 6
twototoo222 楼主
SetAttributes[k, Flat];
k[x_] := x
计算k[x],会无限迭代
但是
k[x_] := x;
SetAttributes[k, Flat]
然后再计算k[x]
就不迭代了,真奇怪!
第一个发生无限迭代应该是和OneIdentity属性有关,但交换位置能影响这个?
2013年04月25日 07点04分 6
好像SetAttributes只在函数定义前有效。
2013年04月25日 10点04分
回复 0577216 :但是在计算k[x]之前查看k的属性,里面有Flat属性啊。[$1]但是如果在SetAttributes[k, Flat]之后再定义一遍k[x],就会迭代。属性是和符号关联的,不是和定义关联的,如果和函数定义顺序有关的话,就说不通了吧
2013年04月25日 13点04分
1