返回列表 发帖
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


怎么会呢?
给个直观点
@echo off
set n=8
for /l %%i in (1 1 %N%) do (
    set /a i=%%i+1
    call :lp "%%i"
)
pause&exit
:lp
for /l %%i in (%i% 1 %N%) do (
     set /a i=%%i+1
     echo %~1 %%i
     if %%i equ %n% exit/b
     CALL :Lp "%~1 %%i"
)COPY

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完毕之后都陆续被执行了。测试如下:
@echo off&setlocal enabledelayedexpansion
call :lp
pause
:lp
for /l %%a in (1,1,5) do (
    echo %%a
    set/an+=1&if !n! equ 3 call :lp
)COPY
第一次for:本该执行5次echo%%a,但执行到3的时候被call :lp阻断了(此时echo 4和echo 5被“存”起来了),接着就完整的执行了一次for,完了把存起来的echo 4和echo 5也执行了,所以有如下结果(用空行分隔了一下,方便分析):
1
2
3
1
2
3
4
5
4
5COPY
而且这种存储确实是按照类似“堆栈”的方式,即“后进先出”,从下面代码,的执行结果就可以看出来:
@echo off&setlocal enabledelayedexpansion
call :lp
pause
:lp
for /l %%a in (1,1,5) do (
    echo %%a
    set/an+=1
    if !n! equ 3 call :lp
    if !n! equ 5 call :lp
)COPY
结果(用空行分隔了一下,方便分析):
1
2
3
1
2
1
2
3
4
5
3
4
5
4
5COPY
第一个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

返回列表