[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
ters这种方法会漏掉不少组合吧。
假设有1-15这15个数,在取两个数的组合中就只能得到1-2,2-3,3-4,4-5...14-15,而其它的1-3,1-4,1-5...等都漏掉了

TOP

ters这种方法会漏掉不少组合吧。
假设有1-15这15个数,在取两个数的组合中就只能得到1-2,2-3,3-4,4-5...14-15,而其它的1-3,1-4,1-5...等都漏掉了
wankoilz 发表于 2011-5-13 10:01


怎么会呢?
给个直观点
  1. @echo off
  2. set n=8
  3. for /l %%i in (1 1 %N%) do (
  4.     set /a i=%%i+1
  5.     call :lp "%%i"
  6. )
  7. pause&exit
  8. :lp
  9. for /l %%i in (%i% 1 %N%) do (
  10.      set /a i=%%i+1
  11.      echo %~1 %%i
  12.      if %%i equ %n% exit/b
  13.      CALL :Lp "%~1 %%i"
  14. )
复制代码

TOP

本帖最后由 wankoilz 于 2011-5-13 22:54 编辑

抱歉,之前不能上网,自己照着手机在电脑上测试了一下你的代码有点问题,现在直接复制代码测试是没问题的。
看来我还没高清楼上的算法,请教下:楼上代码的运行结果中,从 12,123,1234,12345,123456,1234567,12345678后接着是123456 8 ,为什么会有123456 8这个结果呢(按照我的理解接下来应该是23,234,2345,23456...),不懂...

TOP

递归里面用循环,循环体里面又递归调用,这个递归是很多层的。(这种方法很少用,要死很多脑细胞的)
楼上估计是把递归函数第一个语句还要循环给忘了:
for /l %%i in (%i% 1 %N%) do (

TOP

本帖最后由 wankoilz 于 2011-5-15 19:48 编辑

我的理解是:批处理开始执行第一个for,调用函数会得到12,123,1234,12345,123456,1234567,12345678。此时跳出函数,回到for,再调用函数得到23,234,2345,23456,234567,2345678
我就想知道我在18楼说的123456 8的结果是怎么来的(代码具体是如何执行的),恕我愚钝哪...

TOP

“调用函数会得到12,123,1234,12345,123456,1234567,12345678。此时跳出函数”
递归函数也有for啊,这个for取第一个值时,通过递归,就得到了12,123,1234,12345,123456,1234567,12345678,还远远没到跳出的时候。每次递归都要带来一次循环,每个循环体里面又要递归……

TOP

本帖最后由 wankoilz 于 2011-5-18 14:30 编辑

感谢powerbat讲解。确实!我之前还以为批处理递归没有这种“堆栈”的效果,结果测试了一下还真如楼上所说:每次call 都带来一次循环,那些被call阻挡的,没来得及执行的代码似乎被放入类似“堆栈”的结构里,在call完毕之后都陆续被执行了。测试如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. call :lp
  3. pause
  4. :lp
  5. for /l %%a in (1,1,5) do (
  6.     echo %%a
  7.     set/an+=1&if !n! equ 3 call :lp
  8. )
复制代码
第一次for:本该执行5次echo%%a,但执行到3的时候被call :lp阻断了(此时echo 4和echo 5被“存”起来了),接着就完整的执行了一次for,完了把存起来的echo 4和echo 5也执行了,所以有如下结果(用空行分隔了一下,方便分析):
  1. 1
  2. 2
  3. 3
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. 4
  10. 5
复制代码
而且这种存储确实是按照类似“堆栈”的方式,即“后进先出”,从下面代码,的执行结果就可以看出来:
  1. @echo off&setlocal enabledelayedexpansion
  2. call :lp
  3. pause
  4. :lp
  5. for /l %%a in (1,1,5) do (
  6.     echo %%a
  7.     set/an+=1
  8.     if !n! equ 3 call :lp
  9.     if !n! equ 5 call :lp
  10. )
复制代码
结果(用空行分隔了一下,方便分析):
  1. 1
  2. 2
  3. 3
  4. 1
  5. 2
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 3
  12. 4
  13. 5
  14. 4
  15. 5
复制代码
第一个for,执行到3的时候被call阻断,输出1,2,3(echo 4和echo 5被保存),然后执行第二次for,执行到2的时候n等于5了,再次call,这时输出1,2(echo 3,echo 4,echo 5被保存),然后是最后一个完整的for,输出1,2,3,4,5。完了执行被保存的call(后保存的先执行),输出3,4,5和4,5。
这样看来15楼的代码是很不错的!

TOP

返回列表