【问题标题】:In COBOL, is it possible to recursively call a paragraph?在COBOL中,是否可以递归调用一个段落?
【发布时间】:2015-01-06 20:40:21
【问题描述】:

在 IBM 大型机的 COBOL 中,是否可以递归调用段落?

200-PARAGRAPH SECTION.

    IF WS-COUNTER < 10
       ADD 1 TO WS-COUNTER
       PERFORM 200-PARAGRAPH
    ELSE
       DISPLAY 'I'M DONE'
    END-IF.

 200-EXIT.
    EXIT.

【问题讨论】:

  • 没有。一个 imlmenehtstion 可以免费支持递归 PEFFROM,但这不是必需的。
  • @EJP imlmenehtstion?
  • “实施”是我最好的猜测:-D

标签: recursion cobol mainframe


【解决方案1】:

检查当前的 COBOL 语言参考,但 AFAIR a para 无法自行执行。措辞类似于您将得到不可预测的结果,因为不支持递归。

如果您需要遍历相同的代码,也许您需要重构以使用 PERFORM UNTIL?

【讨论】:

  • Note: A PERFORM statement must not cause itself to be executed. A recursive PERFORM statement can cause unpredictable results.
【解决方案2】:

@jdv 是正确的。

如果您想要递归,您可以使整个程序递归,查看同一手册(企业 COBOL 语言参考)和它的姐妹企业 COBOL 编程指南,特别是在 PROGRAM-ID 及其选项。

但是,如果您没有其他方法可以做到这一点,我只建议使用递归,这很少见。递归程序的开销很大。

你展示这个:

200-PARAGRAPH SECTION.

200-PARAGRAPH 位只是一个标签,只是一个名称。 SECTION 这个词告诉你它是什么,它不是一个段落。你确实有一个段落里面SECTION

不,SECTION 也不能递归使用。

过去,PROCEDURE DIVISION 中的 SECTION 更为重要。随着 COBOL 1985 标准的各种变化,SECTION 变得不那么重要了。

这就是我的编码方式(根据当地标准):

    PERFORM                      200-descriptive-and-meaningful-name
        invariant-data-item-with-a-VALUE-of-ten
                                 TIMES
    DISPLAY "I'M DONE"

200-descriptive-and-meaningful-name.
    CONTINUE (just representative of whatever code you need)
    .

或者做同样事情的内联执行(我喜欢执行段落,因为它有助于程序的自我记录)。

请注意,这些名称是为了向您解释阅读本文。您应该使用对手头的业务任务有意义的不同名称。

语言参考和编程指南是大量文档,可作为 PDF 格式免费下载或在线搜索。在 SO 之前进行这些呼叫。也不要忘记你应该有可以提供帮助的同事。

【讨论】:

  • 我不知道,你的名字比我几十年来研究 COBOL 程序时遇到的许多名字都更具描述性。 :)
【解决方案3】:

我不确定您显示的代码在技术上是否符合递归条件。但是,以下代码可以工作并且与平台无关。

       PERFORM
         VARYING ws-counter FROM 1 BY 1
           UNTIL ws-counter > 9
       END-PERFORM.
       DISPLAY 'I' QUOTE 'M DONE'.

如果你想真正开始 COBOL 程序员之间的斗争,请阅读这篇文章。

   200-SECTION SECTION.
   200-PARAGRAPH.
       IF ws-counter < 10
           ADD 1 TO ws-counter
           GO TO 200-PARAGRAPH
       ELSE
           DISPLAY 'I' QUOTE 'M DONE'
       END-IF.

虽然我可能更喜欢这个,但如果要采用 GO TO 方法。

   200-SECTION SECTION.
   200-PARAGRAPH.
       IF ws-counter < 10
           ADD 1 TO ws-counter
           GO TO 200-PARAGRAPH
       END-IF.
       DISPLAY 'I' QUOTE 'M DONE'.

我必须问一下,你想要完成什么?假设您的代码有效,它所做的就是数到十。这样就可以了,而且更简单。

       MOVE 10 TO ws-counter.
       DISPLAY 'I' QUOTE 'M DONE'.

我认为这是我会推荐的。

       05  ws-counter               PIC 9(02).
       05  max-passes               PIC 9(02) BINARY VALUE 10.

       MOVE ZERO TO ws-counter.
       PERFORM 200-PARAGRAPH
           UNTIL ws-counter >= max-passes.
       DISPLAY 'I' QUOTE 'M DONE'.

   200-PARAGRAPH.
       ADD 1 TO ws-counter.

【讨论】:

  • 该部分/段落自己执行,除非我对递归的理解是错误的,即递归。这只是一个技术问题,因为我来自 Java,我正试图弄清楚如何在 Cobol 中做事。
  • IBM 的文档将其称为递归。我知道你的意思,但这只是一个段落/部分直接执行的例子。让它计算一个阶乘不会改变任何东西,它仍然不能那样做。无论如何,我确实喜欢最后的切入点:-) 经常有代码可以完成类似的事情......
  • 另外,PERFORM 10 TIMES ADD 1 TO ws-counter END-PERFORM DISPLAY "I'M DONE" 是您最后的中介 :-) 当然以 INITIALIZE ws-counter 为前缀。
  • 向 ws 计数器添加 10。显示“我完成了”。 :-p
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2011-03-09
  • 2020-04-18
  • 2020-01-22
  • 2019-02-04
  • 1970-01-01
相关资源
最近更新 更多