返回列表 发帖

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

以一段小代码(计算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%COPY
***共同提高***

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!COPY
同理,vbs 里用 Execute、ExecuteGlobal 和 ScriptControl 实现的应该也不算是递归吧——纯联想,虽然没那个必要哈...

TOP

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

TOP

本帖最后由 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 %2COPY
[url=][/url]

TOP

回复 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:eofCOPY

TOP

本帖最后由 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 ")COPY
1

评分人数

    • CrLf: 大湿++技术 + 1
[url=][/url]

TOP

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

TOP

回复 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!
)COPY
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

组合

本帖最后由 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"
endlocalCOPY
Press Any Key To Continue...

TOP

返回列表