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

Posted

技术标签:

【中文标题】在COBOL中,是不是可以递归调用一个段落?【英文标题】: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 【参考方案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

以上是关于在COBOL中,是不是可以递归调用一个段落?的主要内容,如果未能解决你的问题,请参考以下文章

3-递归调用

递归算法还不是很理解!!高手教一教!

36.C#--方法的递归

C 递归 详解(通俗易懂)

Golang-递归

栈与递归