首页 > 解决方案 > Cobol 递归程序第 n 个斐波那契数

问题描述

我正在尝试通过在 COBOL 中使用递归技术来编写第 n 个斐波那契数的逻辑。下面是代码。但是我得到错误的结果可能是问题所在?

对于输入 7,它给出的结果为ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 01 ret-fib= 03 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 03 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 01 ret-fib= 03 ret-fib= 05 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 01 ret-fib= 03 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 03 ret-fib= 05 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 01 ret-fib= 03 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 03 ret-fib= 01 ret-fib= 00 ret-fib= 01 ret-fib= 01 ret-fib= 03 ret-fib= 05 ret-fib= 07.

预期结果是输入的前 7 个斐波那契数7

  identification division.
   program-id. fib recursive.

   data division.
   working-storage section.
   01  numb pic 9 value 7.
   01 result1 pic 9(2).
   01 result2 pic 9(2).

   local-storage section.
   01  num pic 99.
   01  ret-fib pic 9(2).

   procedure division.

       move numb TO num.

       EVALUATE num
       WHEN 0
       move 0 to ret-fib

       WHEN  1
        move 1 to ret-fib

       WHEN OTHER
         compute num = num - 1
         move num to numb
         call "fib" using  num
         move num to result1
         compute num = num - 1
         move num to numb
         call "fib" using num
         move num to result2
          compute ret-fib = result1 + result2
       END-EVALUATE
          display 'ret-fib= ' ret-fib.
        goback.

标签: recursionfibonaccicobol

解决方案


在下面的代码中,不num包含. 这意味着两者都不会有正确的值,除非是偶然的。ret-fibcallresult1result2

     move num to numb
     call "fib" using  num
     move num to result1
     compute num = num - 1
     move num to numb
     call "fib" using num
     move num to result2

每次调用fibPROCEDURE DIVISION标题都应该有一个RETURNING短语来获取ret-fib适当的值result1or result2

此外,两者result1result2都应该在 中LOCAL-STORAGE SECTION,因为某些计算 usingresult1将通过后续调用延迟,并且result1在这些计算中将使用不同的值 for。

递归计算第 n 个斐波那契数的标准算法使用一个主程序和一个递归程序(函数)。递归程序可以是包含程序(2002)。可以尝试在单个 COBOL 程序中完成这两项工作(使用非标准ENTRY语句)。它增加了不必要的并发症,因此是不可取的。

为了使用递归获得前 7 个斐波那契数,需要为每个值调用递归程序(函数)06


推荐阅读