【问题标题】:Recursive tail function in GnuCOBOL 2.0 (with OpenCobolIDE 4.7.6)GnuCOBOL 2.0 中的递归尾函数(使用 OpenCobolIDE 4.7.6)
【发布时间】:2020-10-05 21:31:38
【问题描述】:

我是 COBOL 和 GnuCOBOL 的新手(在 Windows 中)。

我正在尝试编写一个带有尾部的递归函数,但程序没有返回值,这可能会帮助我。我想知道我想要的语言是否可以实现?

跟随功能码

   IDENTIFICATION DIVISION.
   FUNCTION-ID. FATBASE.

   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-PAR PIC 99.

   LINKAGE SECTION.
   77  LK-NUM PIC 99.
   77  LK-PAR PIC 99.
   77  LK-FAT PIC 9(33).

   PROCEDURE DIVISION USING BY VALUE LK-NUM, LK-PAR
   RETURNING LK-FAT.
       IF NUMVAL(LK-NUM) = 0
          COMPUTE LK-FAT = NUMVAL(LK-PAR)
       ELSE
          COMPUTE LS-NUM = LK-NUM - 1
          COMPUTE LS-PAR = LK-NUM * NUMVAL(LK-PAR)
          COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       END-IF
       GOBACK.
   END FUNCTION FATBASE.

跟随调用函数的程序的代码

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TESTEFAT.

   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION FATBASE
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-FAT PIC Z(33).

   PROCEDURE DIVISION.
       ACCEPT LS-NUM.
       MOVE FATBASE(LS-NUM, 1) TO LS-FAT
       DISPLAY FATBASE(LS-NUM, 1)
       STOP RUN.

至于 IF/THEN 命令,这些都可以正常工作。 COMPUTE 命令出现问题。 COMPUTE 行似乎没有预期的计算效果。似乎只有 LS-NUM 和 LK-NUM 变量有任何值。其他变量在处理过程中归零。

       IF NUMVAL(LK-NUM) = 0
          COMPUTE LK-FAT = NUMVAL(LK-PAR)
       ELSE
          COMPUTE LS-NUM = LK-NUM - 1
          COMPUTE LS-PAR = LK-NUM * NUMVAL(LK-PAR)
          COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       END-IF

提前感谢您的帮助。

程序已附上。

最好的问候。

================================================ ==============================

在这篇文章之后的一天结束时,我得到了外部帮助 - 可在:https://sourceforge.net/p/open-cobol/discussion/cobol/thread/54637a961a/?limit=250#313c/7037/dbaf/3684

【问题讨论】:

  • DISPLAY FATBASE(LS-NUM, 1)

标签: function recursion cobol tail gnucobol


【解决方案1】:

尾跟随阶乘运算的基本代码

   IDENTIFICATION DIVISION.
   FUNCTION-ID. FATBASE.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-PAR PIC 9(33).

   LINKAGE SECTION.
   77  LK-NUM PIC 99.
   77  LK-PAR PIC 9(33).
   77  LK-FAT PIC 9(33).

   PROCEDURE DIVISION USING BY VALUE LK-NUM, LK-PAR
   RETURNING LK-FAT.
       IF LK-NUM = 0
          COMPUTE LK-FAT = LK-PAR
       ELSE
          COMPUTE LS-NUM = LK-NUM - 1
          COMPUTE LS-PAR = LK-NUM * NUMVAL(LK-PAR)
          COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       END-IF
       GOBACK.
   END FUNCTION FATBASE.

跟随阶乘执行的中间子程序的代码

   IDENTIFICATION DIVISION.
   FUNCTION-ID. FATOR2.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION FATBASE
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 9(2).
   77  LS-PAR PIC 9(33).

|链接部分。 77 LK-NUM PIC 99。 77 LK-FAT PIC 9(33)。

   PROCEDURE DIVISION USING LK-NUM RETURNING LK-FAT.
       MOVE NUMVAL(LK-NUM) TO LS-NUM
       MOVE 1 TO LS-PAR
       COMPUTE LK-FAT = NUMVAL(FATBASE(LS-NUM, LS-PAR))
       GOBACK.
   END FUNCTION FATOR2.

遵循使用尾递归阶乘函数的程序代码。

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TESTEFAT.
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   REPOSITORY.
       FUNCTION FATOR2
       FUNCTION ALL INTRINSIC.

   DATA DIVISION.
   LOCAL-STORAGE SECTION.
   77  LS-NUM PIC 99.
   77  LS-FAT PIC Z(33).

   PROCEDURE DIVISION.
       ACCEPT LS-NUM.
       MOVE FATOR2(LS-NUM) TO LS-FAT
       DISPLAY TRIM(LS-FAT).
       STOP RUN.

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多