中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 13:40
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【分享】bat递归的"917“新发现 查看 1,431 回复 14
楼 主 【分享】bat递归的"917“新发现 发表于 2009-04-10 14:09 ·  中国 上海 闵行区 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
命令行下键入

f 1000 ans
echo %ans%



以下代码保存为f.bat
:f //求%1的阶乘  
@set/a n=%1-1
@if %1==0 (set/a %2=1) else (call:f %n% m&set/a %2=%1*m)


[ Last edited by plp626 on 2009-4-10 at 14:11 ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2 发表于 2009-04-10 17:23 ·  中国 北京 丰台区 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
真不敢运行
话说高人的代码向人来高深莫测

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
3 发表于 2009-04-10 22:20 ·  中国 北京 联通
银牌会员
★★★
积分 1,287
发帖 634
注册 2007-05-02 15:06
19年会员
UID 87277
性别 男
来自 cmd.exe
状态 离线
来回Call的话就会这样.

Call有限制的..
4 发表于 2009-04-11 01:11 ·  中国 上海 浦东新区 电信
初级用户
积分 30
发帖 19
注册 2009-04-04 03:50
17年会员
UID 142065
性别 男
状态 离线
H:\Documents and Settings\Pierre>f 1000 ans
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=619, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
5 发表于 2009-04-11 01:14 ·  中国 上海 浦东新区 电信
初级用户
积分 30
发帖 19
注册 2009-04-04 03:50
17年会员
UID 142065
性别 男
状态 离线
620就超出了,看来最多619
而实际上超过33就不能算了,而32和33都是-2147483648
6 发表于 2009-04-11 05:22 ·  中国 福建 泉州 电信
银牌会员
★★★
积分 1,276
发帖 469
注册 2002-12-23 13:00
23年会员
UID 586
性别 男
来自 福建泉州
状态 离线
由于CMD下
数字精确度限为 32 位.
所以最多到33就不能计算了,超出最大值.
QQ:366840202
http://chenall.net
7 发表于 2009-04-11 07:55 ·  中国 上海 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
Originally posted by Pierre at 2009-4-11 01:14 AM:
620就超出了,看来最多619
而实际上超过33就不能算了,而32和33都是-2147483648


你这是个什么系统,怎么会是619呢?


****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=917, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
8 发表于 2009-04-12 07:55 ·  中国 四川 南充 营山县 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
Originally posted by Pierre at 2009-4-11 01:14:
620就超出了,看来最多619
而实际上超过33就不能算了,而32和33都是-2147483648

我也是递归到917就后就报错了


而上面的计算方法中n!结算到 13!就已经溢出了,超过12阶后计算出来的都是错误的!
9 发表于 2009-04-12 08:14 ·  中国 四川 南充 营山县 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
我刚才试了下递归层数好像还跟什么有关系,如下面的
@echo off
:aa
call :aa a


****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******

说明最大递归次数是1240

[ Last edited by 不得不爱 on 2009-4-12 at 08:19 ]
10 发表于 2009-04-12 09:00 ·  中国 湖北 黄石 阳新县 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=917, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
917;)
11 发表于 2009-04-12 10:48 ·  中国 上海 浦东新区 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
Originally posted by 不得不爱 at 2009-4-12 07:55 AM:

我也是递归到917就后就报错了


而上面的计算方法中n!结算到 13!就已经溢出了,超过12阶后计算出来的都是错误的!


我只是举了个递归简单的例子,超过13当然作为阶乘的结果都是错误的
其实在cmd里没有溢出一说,他只是循环移位,不管数值范围。

:a
call:a a


这个例子更简洁,好!

不过也不知道为什么是1240了
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
12 发表于 2009-04-12 13:57 ·  中国 上海 电信
初级用户
积分 30
发帖 19
注册 2009-04-04 03:50
17年会员
UID 142065
性别 男
状态 离线
2003 r2 ent x64
13 发表于 2009-04-12 22:20 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
阀值应是2480吧
递归有进有出的
这应跟线程的页面文件或内存分配有关
49206C6F766520796F752067757973 54656C3A3133383238343036373837
14 发表于 2009-10-14 20:04 ·  中国 广东 广州 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
啥? 我的这样
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
15 发表于 2009-10-14 20:07 ·  中国 广东 广州 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
有一个好像可以超越call层次的方法
建立一个xxx.bat

代码为

echo %1
xxx a

好像返回的时候环境不能恢复……多此一举了

[ Last edited by 523066680 on 2009-10-14 at 20:44 ]
论坛跳转: