标题: [数值计算] 批处理递归算法示例: [打印本页]
作者: batman 时间: 2013-7-21 17:14 标题: 批处理递归算法示例:
以一段小代码(计算16的阶乘)对批处理递归算法进行示例,
是的,批没有严格意义上的函数,但是它有call。。。- @echo off
- call :lp 16
- echo %total%
- pause>nul&exit
- :lp
- if not defined num set /a num=%1,total=1
- if %num% neq 0 set /a total*=num,num-=1&call :lp %num%
复制代码
作者: CrLf 时间: 2013-7-21 21:24
http://baike.baidu.com/view/96473.htm
按百科释义,递归的概念并不局限于函数,我的理解是只要调用自己应该就算是递归了吧?
话说下面这样虽然反复引用了变量中的语句,但应该算不上递归吧:- @echo off
- set /a n=m=1
- set bat="%~0"
- setlocal enabledelayedexpansion
- set "next=if ^!n^! leq 12 (set /a m*=n,n+=1&echo ^!next^!>>^!bat^!) else (echo ^!m^!&pause&exit)"
- (echo;&echo !next!)>>!bat!
复制代码
同理,vbs 里用 Execute、ExecuteGlobal 和 ScriptControl 实现的应该也不算是递归吧——纯联想,虽然没那个必要哈...
作者: CrLf 时间: 2013-7-21 21:49
某人的回帖是我删的,原因是大概只有他自己觉得那样的回帖不算是挑衅或者谩骂
事先提醒过了,既然他觉得自己在做正确的事,那我也得做我认为正确的事
不针对语言和个人,只针对不合适的言行
作者: 523066680 时间: 2013-7-22 00:31
本帖最后由 523066680 于 2013-7-22 00:34 编辑
批处理解汉诺塔会比较经典,
http://bathome.net/viewthread.php?tid=4892
见某一楼- @echo off
- set /p inp="1-7: "
- call :next %inp% a c b
- pause
- :next
- if %1 equ 0 goto :eof
- set /a now=%1-1
- call :next %now% %2 %4 %3
- echo,%1 from %2 to %3
- set /a now=%1-1
- call :next %now% %4 %3 %2
复制代码
作者: CrLf 时间: 2013-7-22 00:44
回复 4# 523066680
被你一说才想起来,plp 的排列组合也是个经典的例子:- @echo off
- call:perm "a b c xy z"
- pause
-
- :perm <"c1 c2 ..."> // code by plp
- setlocal enabledelayedexpansion&set "s=%~1 "
- if "!s: =!" == "" (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
- endlocal&goto:eof
复制代码
作者: 523066680 时间: 2013-7-22 09:54
本帖最后由 523066680 于 2013-7-22 09:56 编辑
回复 5# CrLf
可以不要setlocal和endlocal,call返回的时候重设一下%s%=%~1
call 的时候刚好可以用 %%var%%的方式所以可以去掉setlocal enabledelayedexpansion- @echo off
- call:perm "1 2 3 4 5 6"
- pause
-
- :perm <"c1 c2 ..."> // code by plp
- set "s=%~1 "
- if "%s: =%" == "" (echo %~2 &goto:eof)
- for %%b in (%~1) do (call:perm "%%s:%%b =%%" "%~2%%b" &set "s=%~1 ")
复制代码
作者: xxpinqz 时间: 2013-7-22 18:40
一个CALL的比一个牛,此楼略过。
作者: 悬崖之树 时间: 2013-7-22 20:41
回复 1# batman
斑竹,你的代码好像不对啊。我小改一下。- @echo off
- setlocal enabledelayedexpansion
- set total=1
- call :lp 16
- echo %total%
- pause>nul&exit
- :lp
- set /a num=%1
- if %num% neq 0 (
- set /a total*=num,num-=1&call :lp !num!
- )
复制代码
作者: PakTC 时间: 2013-7-27 17:53 标题: 组合
本帖最后由 PakTC 于 2013-7-27 18:00 编辑
- @echo off
- Rem Combination.bat by Paktc
- call :func "abcd" ""
- pause &exit
-
- :func
- setlocal
- if %1=="" (
- if not %2=="" (echo %~2)
- goto :eof
- )
- set strnow=%~1
- call :func "%strnow:~1%" "%~2%strnow:~0,1%"
- call :func "%strnow:~1%" "%~2"
- endlocal
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |