[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 批处理递归算法示例:

以一段小代码(计算16的阶乘)对批处理递归算法进行示例,
是的,批没有严格意义上的函数,但是它有call。。。
  1. @echo off
  2. call :lp 16
  3. echo %total%
  4. pause>nul&exit
  5. :lp
  6. if not defined num set /a num=%1,total=1
  7. if %num% neq 0 set /a total*=num,num-=1&call :lp %num%
复制代码
***共同提高***

http://baike.baidu.com/view/96473.htm
按百科释义,递归的概念并不局限于函数,我的理解是只要调用自己应该就算是递归了吧?
话说下面这样虽然反复引用了变量中的语句,但应该算不上递归吧:
  1. @echo off
  2. set /a n=m=1
  3. set bat="%~0"
  4. setlocal enabledelayedexpansion
  5. set "next=if ^!n^! leq 12 (set /a m*=n,n+=1&echo ^!next^!>>^!bat^!) else (echo ^!m^!&pause&exit)"
  6. (echo;&echo !next!)>>!bat!
复制代码
同理,vbs 里用 Execute、ExecuteGlobal 和 ScriptControl 实现的应该也不算是递归吧——纯联想,虽然没那个必要哈...

TOP

某人的回帖是我删的,原因是大概只有他自己觉得那样的回帖不算是挑衅或者谩骂
事先提醒过了,既然他觉得自己在做正确的事,那我也得做我认为正确的事
不针对语言和个人,只针对不合适的言行

TOP

本帖最后由 523066680 于 2013-7-22 00:34 编辑

批处理解汉诺塔会比较经典,

http://bathome.net/viewthread.php?tid=4892
见某一楼
  1. @echo off
  2. set /p inp="1-7: "
  3. call :next %inp% a c b
  4. pause
  5. :next
  6. if %1 equ 0 goto :eof
  7. set /a now=%1-1
  8. call :next %now% %2 %4 %3
  9. echo,%1 from  %2  to  %3
  10. set /a now=%1-1
  11. call :next %now% %4 %3 %2
复制代码

TOP

回复 4# 523066680


    被你一说才想起来,plp 的排列组合也是个经典的例子:
  1. @echo off
  2. call:perm "a b c xy z"
  3. pause
  4. :perm <"c1 c2 ..."> // code by plp
  5. setlocal enabledelayedexpansion&set "s=%~1 "
  6. if "!s: =!" == ""  (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
  7. endlocal&goto:eof
复制代码

TOP

本帖最后由 523066680 于 2013-7-22 09:56 编辑

回复 5# CrLf


   可以不要setlocal和endlocal,call返回的时候重设一下%s%=%~1
call 的时候刚好可以用 %%var%%的方式所以可以去掉setlocal enabledelayedexpansion
  1. @echo off
  2. call:perm "1 2 3 4 5 6"
  3. pause
  4. :perm <"c1 c2 ..."> // code by plp
  5. set "s=%~1 "
  6. if "%s: =%" == ""  (echo %~2 &goto:eof)
  7. for %%b in (%~1) do (call:perm "%%s:%%b =%%" "%~2%%b" &set "s=%~1 ")
复制代码
1

评分人数

    • CrLf: 大湿++技术 + 1

TOP

一个CALL的比一个牛,此楼略过。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 1# batman
斑竹,你的代码好像不对啊。我小改一下。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set total=1
  4. call :lp 16
  5. echo %total%
  6. pause>nul&exit
  7. :lp
  8. set /a num=%1
  9. if %num% neq 0 (
  10.    set /a total*=num,num-=1&call :lp !num!
  11. )
复制代码
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

组合

本帖最后由 PakTC 于 2013-7-27 18:00 编辑
  1. @echo off
  2. Rem Combination.bat by Paktc
  3. call :func "abcd" ""
  4. pause &exit
  5. :func
  6. setlocal
  7.    if %1=="" (
  8.      if not %2=="" (echo %~2)
  9.      goto :eof
  10.    )
  11.    set strnow=%~1
  12.    call :func "%strnow:~1%" "%~2%strnow:~0,1%"
  13.    call :func "%strnow:~1%" "%~2"
  14. endlocal
复制代码
Press Any Key To Continue...

TOP

返回列表