Рекурсивная хвостовая функция в GnuCOBOL 2.0 (с OpenCobolIDE 4.7.6) - PullRequest
2 голосов
/ 16 июня 2020

Я новичок в 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

1 Ответ

0 голосов
/ 18 июня 2020

По хвосту следует базовому коду факториальной операции

   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 PI C 99. 77 LK-FAT PI C 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.
...