公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+1 投票
1.9k 浏览

最近做点小练习,写了以下的代码:

 
Test[5, x_, i_] := 
  Block[{n = 0, sum = 0}, 
   Catch[Print[0]; Label[Start]; Print["boot"]; Print[sum]; Print[n]; 
          ((sum += 
        InverseFunction[Gamma][InverseFunction[Gamma][Zeta[N[i]]]]; 
       n++; Print[1]; Goto[Start]) /; 
              OddQ[n] === False && n < NextPrime[x]; 
            (sum += 
        InverseFunction[Gamma][
         InverseFunction[Gamma][Zeta[BarnesG[N[i] + I]]]]; n++; 
       Print[2]; Goto[Start]) /; 
              OddQ[n] === True && n < NextPrime[x]; 
     Throw[sum] /; n >= NextPrime[x])]]; 

原本的期望是和输出以下代码一致:

Test[4, x_, i_] := 
  Block[{n = 0, sum = 0}, 
   Catch[Print[0]; Label[Start]; Print["boot"]; Print[sum]; Print[n]; 
          
    Piecewise[{{sum += 
        InverseFunction[Gamma][InverseFunction[Gamma][Zeta[N[i]]]]; 
       n++; Print[1]; Goto[Start], 
                OddQ[n] === False && n < NextPrime[x]}, 
              {sum += 
        InverseFunction[Gamma][
         InverseFunction[Gamma][Zeta[BarnesG[N[i] + I]]]]; n++; 
       Print[2]; Goto[Start], 
                OddQ[n] === True && n < NextPrime[x]}, {Throw[sum], 
       True}}]]]; 

但是测试一下的话:

Test[4, 10, 3]

Test[5, 10, 3]

Test5代码会陷入死循环....为何限制模式没法匹配Test5代码在后面的Print[2]和Throw?

用户: EmberEdison (806 分)

1个回答

+3 投票
 
已采纳

/;的函数名是Condition,Condition的适用范围与你想象中的不是一回事。

Condition本身不具有Hold类的属性,所以可以领悟一下下面这句话没有达到目的的原因,也是你代码陷入死循环的原因。

Condition[1 + 2, 3 > 4]

仔细观察帮助文档,可以看到Condition都是和延迟相关的进行配合的,他是和规则紧密联系的,而不是你这里使用的一个立刻计算。实际上Condition这个函数确实称得上略诡异,看得我都不想用了,反正有万能的If。

话说你的代码稍微啰嗦了点,可以改改。

Test[6, x_, i_] := 
  Sum[InverseFunction[Gamma][
    InverseFunction[Gamma][
     Zeta[If[OddQ[n], N[i], BarnesG[N[i] + I]]]]], {n, NextPrime[x]}];

Test[6, 10, 3]

 

用户: 苹果 (2.2k 分)
采纳于 用户:EmberEdison
嘛。。其实是故意的,目前在做一个课题,是做一个超级消耗时间的核函数,然后用不同的循环体和条件判断体来检验那个条件判断体与循环体的组合省时间..这个函数应该用Tr[ParallelTable[...]]最省时间
等一下..Condition不是HoldAll么?
恩,是HoldAll,这里是我搞错了,这样我的例子更加表明了“实际上Condition这个函数确实称得上略诡异,看得我都不想用了”。。如果没有延迟赋值或延迟替换去Hold的话,Condition内部的计算会让HoldAll无效...
补充一下。“Condition都是和延迟相关的进行配合的,他是和规则紧密联系的,而不是你这里使用的一个立刻计算”的一个更准确的表述是:Condition[patt, test]构造的是一个模式(Pattern),它仅能用于限制某个模式是否匹配,也就是说,当test被满足时,这个patt才会被进一步用于匹配。然后,关于Condition第一个参数的自动计算,虽然我没研究过这个问题,但其实很多函数都有类似的行为,我所知的有这两个(注意两个例子的原因不同):http://mathematica.stackexchange.com/q/117994/1871 http://mathematica.stackexchange.com/q/110499/1871
...