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

5

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

不是必须的,但实现可以支持递归PEFFROM。 - user207421
1
@EJP 实现? - Bill Woodger
“Implementation” 是我最好的猜测 :-D - Algoman
3个回答

5

请参考当前的COBOL语言参考资料,但据我所记,一个段落不能执行自己。措辞大致是这样的:你将会得到不可预测的结果,因为不支持递归。

如果您需要反复运行相同的代码,也许重构以使用PERFORM UNTIL是您需要的?


3
注意:PERFORM语句不能导致其本身被执行。递归的PERFORM语句可能会导致不可预测的结果。 - Bill Woodger

4

@jdv 是正确的。

如果您需要递归,可以将整个程序变成递归,查看相同的手册(Enterprise COBOL语言参考)以及它的姊妹篇,Enterprise 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)
    .

或者使用内联执行相同的操作(我喜欢将段落作为PERFORM,因为它有助于程序的自我记录)。

请注意,这些名称是为了向您阅读此文档的人解释。您应该使用与手头业务任务相关的不同名称。

语言参考和编程指南是实质性的文档,可免费下载为PDF文件,或在线搜索。在寻求帮助之前,请先查看这些文档。还要记得您应该有可以提供帮助的同事。


1
不好意思,您的命名方式比我几十年来看到的 COBOL 程序中的许多命名方式都更具描述性。 :) - zarchasmpgmr

2

我不确定你展示的代码在技术上是否符合递归的定义。然而,以下代码可以正常运行且具有跨平台性。

       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中完成任务。 - zurbergram
IBM的文档称其为递归。我知道你的意思,但那只是一个段落/节直接执行自身的例子。即使让它计算阶乘也不会改变任何事情,它仍然不能这样做。无论如何,我还是喜欢最终的直截了当 :-) 通常有类似的代码可以做到... - Bill Woodger
另外,PERFORM 10 TIMES ADD 1 TO ws-counter END-PERFORM DISPLAY "I'M DONE"是你上一个中间步骤的延伸 :-) 当然,在此之前要加上INITIALIZE ws-counter。 - Bill Woodger
将ws-counter加10。 显示"I'M DONE"。:-p - Algoman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接