在COBOL中,是否可以递归调用一个段落?

In COBOL, is it possible to recursively call a paragraph?

在 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.

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

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

@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 之前将这些作为一个呼叫点。也不要忘记你应该有也能提供帮助的同事。

我不确定您展示的代码在技术上是否符合递归的要求。但是,以下代码有效并且与平台无关。

       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.