免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3109 | 回复: 6
打印 上一主题 下一主题

请教,400下COBOL中的递归调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-21 19:53 |只看该作者 |倒序浏览
程序1:STEST2BU:

       IDENTIFICATION DIVISION .
       PROGRAM-ID. STEST2BU.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER. IBM-AS400.
       OBJECT-COMPUTER. IBM-AS400.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-LK                                  PIC 9(1).

       PROCEDURE DIVISION .

           MOVE 1 TO WS-LK.
           CALL "STEST1BU" USING BY CONTENT WS-LK.

           STOP RUN.


程序2:STEST1BU:

       IDENTIFICATION DIVISION .
       PROGRAM-ID. STEST1BU.

       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SOURCE-COMPUTER. IBM-AS400.
       OBJECT-COMPUTER. IBM-AS400.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-RETURN                              PIC 9(1).
       01 WS-A                                   PIC 9(1).
      
       LINKAGE SECTION.
          01  LK-RETURN                          PIC X(1).

       PROCEDURE DIVISION USING LK-RETURN.
           
           MOVE LK-RETURN TO WS-RETURN.
           MOVE WS-RETURN TO WS-A.
           ADD 1 TO WS-RETURN.
           DISPLAY "A " WS-A.
           IF WS-RETURN < 5
              CALL "STEST1BU" USING BY CONTENT WS-RETURN.
           DISPLAY "B " WS-A.

           EXIT PROGRAM.

运行:

CALL STEST2BU

期待结果:
A 1
A 2
A 3
A 4
B 4
B 3
B 2
B 1

实际结果:
A 1
A 2
A 3
A 4
B 4
B 4
B 4
B 4  

希望哪位同学指点,谢谢哦

论坛徽章:
0
2 [报告]
发表于 2006-07-28 10:24 |只看该作者
怀疑被AS/400 优化了.    内存优化了.

[ 本帖最后由 digitalchina 于 2006-7-28 11:19 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-07-28 14:31 |只看该作者
CALL "STEST1BU" USING BY CONTENT WS-RETURN.
means: LK-RETURN  = WS-RETURN,
then: MOVE LK-RETURN TO WS-RETURN.
           MOVE WS-RETURN TO WS-A.
means:WS-A = LK-RETURN.
DISPLAY "A " WS-A.
DISPLAY "B " WS-A.
应该就是显示累加后的WS-RETURN,显示的没问题呀,没有看出来怎么会越来越小。

论坛徽章:
0
4 [报告]
发表于 2006-07-28 19:47 |只看该作者
谢谢大家,我的同事给我的答案是:
COBOL85中不支持递归调用,在COBOL2000  之后才开始COBOL的递归调用,(包括IBM)但是需要显示的声明为递归程序。格式:PROGRAM-ID.  PGMID  IS  RECURSIVE  PROGRAM.

不过我没用过COBOL2000。

论坛徽章:
0
5 [报告]
发表于 2006-07-28 22:35 |只看该作者
这不是支持的问题呀,你这个程序显然达不到你想要的结果,你调试一下就知道变量怎么变化了。

论坛徽章:
0
6 [报告]
发表于 2006-08-09 23:14 |只看该作者

It's about active group

如果要得到你期望的结果,编译程序的时候选择 *new一个active group.
不然,相同的active group中,同一个变量ws-a被放在同样的存储空间,被最内层的程序修改之后,外层程序中看到的也是相同的值了。

论坛徽章:
0
7 [报告]
发表于 2006-08-10 09:55 |只看该作者
关于子程序的变量如何变化,你可以参考cobol手册,或者搜索我以前的贴子。
这是我以前写的一个递归程序,针对汉诺塔移位的,就是有三个塔A,B,C,A有N个盘子,大的在下,小的在上,借助C, 把A的盘子移动到B, 同样顺序排列。
python写的
# Type "copyright", "credits" or "license" for more information.
>>> def move(a, b):
...     print a,'----->', b
...     
>>> move('A','B')
A -----> B
>>> def digui(n,a,b,c): #move a to b by c 移动a到b,借助c
...     if (n==1):
...         move(a,b)
...     else:   
...         digui(n-1,a,c,b) #move a to c by b 移动a到c,借助b
...         move(a,b)
...         digui(n-1,c,b,a) #move c to b by a 移动c到b,借助a
...         
>>> digui(3,'A','B','C')
A -----> B
A -----> C
B -----> C
A -----> B
C -----> A
C -----> B
A -----> B
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP