在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中,是不是可以递归调用一个段落?的主要内容,如果未能解决你的问题,请参考以下文章