【问题标题】:Is Stata Turing-complete?Stata图灵完备吗?
【发布时间】:2011-05-22 16:35:06
【问题描述】:

我最近一直在使用 Stata 进行一些统计工作,但并不太喜欢它。

我不觉得它是一种“正确”的编程语言:特别是我不认为有一种方法可以循环直到满足条件。

我的感觉是对的,还是 Stata 真的是图灵完备的?

【问题讨论】:

    标签: loops stata turing-complete


    【解决方案1】:

    Stata 的ado 语言具有所有常用的条件语句:

    但是,重要的是不要混淆两者:

    此外,Stata 的ado 语言循环结构包括:

    Mata,Stata的矩阵编程语言也支持:

    因此,Stata 的 adomata 编程语言似乎 满足图灵完备的特征。

    重要的是要注意,尽管这些不是 一般编程 语言,但成熟的统计语言

    【讨论】:

      【解决方案2】:

      虽然您可以使用 -while-、-if、-else- 命令执行循环,直到满足条件,但在 Stata 中使用 -foreach- 或 -forvalues- 循环通常是一个更好的主意。
      所以,不要说:

      while "`1'" != "" {
      <do something>
      } 
      

      if "`a'" == "" {
      <do something>
      }
      else {
      <do something else>
      }
      

      这样做通常会更好(也更直观):

      forvalues x = 1/100 {
      <do something>
      }
      

      -- 不需要 -if-、-else- 或 -break- 条件。有关详细信息,请参阅 Stata 中的 -help forvalues- 或 -help foreach-。


      ^注意:我原帖中的 while-else 循环已被删除——感谢 Keith 的提醒。 -else- 部分仅用于 if{] else{} 循环示例。无论如何,我的帖子的重点并不是建议使用 while/else 或 if/else 循环,而是 -foreach-/-forvalues- 通常是首选方法。

      【讨论】:

        【解决方案3】:

        @eric.a.booth:我觉得你的例子很奇怪。我不确定我见过while { ... } else {...}

        另外,请注意,Stata 不会在您运行循环之前对其进行测试,并且会允许自己陷入无限循环。

        local x = 0
        while `x'<5 {
           display `x' / 2
           local ++x
        }
        

        【讨论】:

        • 我修复了帖子中的 while-else 错误,再次感谢。我的意思是只有 -else- 和 -if- 示例。

          对于您的第二条评论,我看不出您的示例如何将 Stata 置于无限循环中(?)如果您省略了宏扩展(++i 或 -macro shift- 甚至 -continue,break - ) 命令然后它会进入一个无限循环,但这将与 [P]-while- 中的用户手册的指南相反。

        • 我试图举一个有用的例子。因此,我指出需要使用 ++x 之类的东西(以避免无限循环)。
        【解决方案4】:

        从某种意义上说,您可以用它构建网页或 GUI 的“适当”编程语言?当然不是。但这有点极端。您当然可以使用 .ado 和 .do 文件编写循环;我会说它是图灵完整的。

        【讨论】:

        • 您“可以”用它构建网页或 GUI,尽管它不是一个理想的平台,而且它非常有限。例如,我可以为我的网页 w 编写 html。 -file- 命令,使用 -estout- 或 -tabout-(来自 SSC)为我的网页编写表格,或使用 -window- 子命令在 Stata 环境中编写 GUI。请参阅世界银行网站上的 Stata(使用 Stata Numerics)为 ADePt (tinyurl.com/stataadept) 编写的程序/gui。
        【解决方案5】:

        我以前从未听说过 Stata,但网页上吹嘘说它有“if, while”和“looping and branching”。

        维基百科有this example:

        local k = 1
        file open myfile using toto.txt, read text
        file read myfile line
        while r(eof) == 0 {
            local k = `k' + 1
            di "`k' `line'"
            file read myfile line
            }
        file close myfile
        

        我不知道“正确的”编程语言是什么意思,但乍一看它肯定是图灵完备的。

        【讨论】:

        • 不知怎的,我完全错过了 Stata 有一个 while 循环的事实!非常感谢。
        • 我不知道为什么“吹牛”在这里被认为是一个合适的词。
        猜你喜欢
        • 2014-12-26
        • 2015-08-23
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 2017-01-11
        相关资源
        最近更新 更多