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

【该思路已有先例,523066680较早提出】
我认为for嵌套递归始终是最快的方案,所以构思了一个基于for /l递归的新思路,唯一的缺陷是for嵌套理论上限62层[A-Za-z0-9],本代码由于作者偷懒,功能不够强大,仅兼容低于10层,而且不能有重复项...
  1. @echo off&setlocal enabledelayedexpansion
  2. set str= a b c d e f g
  3. set t=%time%
  4. for %%a in (%str%) do (
  5. set /a n+=1,"tmp+=^!tmp"
  6. set "echo=%%!n! !echo!"
  7. )
  8. ::初始化
  9. set "for=for /f %%1 in ("^^!tmp1:%%2 =^^!") do (set /a z+=1)&echo %echo%"
  10. for /l %%a in (2 1 %n%) do (
  11. set /a last=%%a-1
  12. set "for=for %%%%a in (^!tmp%%a^!) do ((set tmp!last!=^!tmp%%a: %%%%a = ^!)&!for!)"
  13. )
  14. ::为str构建相应层数的for嵌套
  15. set tmp%n%=%str%
  16. %for%
  17. ::执行组装而成的for嵌套
  18. echo 共有%z%种组合 开始于%t% 结束于%time%
  19. pause
复制代码

TOP

22# caruko


??
不懂...

TOP

反正5040种组合耗时3秒,应该算不错的成绩了

TOP

你们怎么会认为是字符插入呢?这段代码和我所理解的字符插入的概念一点关系都没有呀,看来原有的注释太少,弄详细点:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str= a b c d e f g
  3. set t=%time%
  4. for %%a in (%str%) do (
  5.         set /a n+=1,"tmp+=^!tmp"
  6.         set "echo=%%!n! !echo!"
  7. )
  8. ::初始化
  9. set "for=for /f %%1 in ("^^!tmp1:%%2 =^^!") do (set /a z+=1)&echo %echo%"
  10. ::定义最里层的for
  11. for /l %%a in (2 1 %n%) do (
  12.         set /a last=%%a-1
  13.         set "for=for %%%%a in (^!tmp%%a^!) do ((set tmp!last!=^!tmp%%a: %%%%a = ^!)&!for!)"
  14. rem 定义for嵌套,一层包一层...
  15. )
  16. ::为str构建相应层数的for嵌套
  17. set tmp%n%=%str%
  18. %for%
  19. ::执行组装而成的for嵌套,改成echo !for!就明白了
  20. echo 共有%z%种组合 开始于%t% 结束于%time%
  21. pause
复制代码

TOP

那个%for%运行起来就是这个效果:
  1. @echo off&setlocal enabledelayedexpansion&set tmp5=a b c de f
  2. for %%5 in (!tmp5!) do (
  3. set tmp4=!tmp5:%%5 =!
  4. for %%4 in (!tmp4!) do (
  5. set tmp3=!tmp4:%%4 =!
  6. for %%3 in (!tmp3!) do (
  7. set tmp2=!tmp3:%%3 =!
  8. for %%2 in (!tmp2!) do (
  9. set tmp1=!tmp2:%%2 =!
  10. for /f "delims=" %%1 in ("!tmp1:%%2=!") do (
  11. echo %%5 %%4 %%3 %%2 %%1
  12. )
  13. )
  14. )
  15. )
  16. )
  17. pause
复制代码
很明显是最土的办法...只是我改进思路后,在执行之前可以自动定义层数,然后用一个变量存储了整个for嵌套,实际运行的代码就是这样子:
  1. @echo off&setlocal enabledelayedexpansion&set tmp5=a b c de f
  2. for %%5 in (!tmp5!) do ((set tmp4=!tmp5:%%5 =!)&for %%4 in (!tmp4!) do ((set tmp3=!tmp4:%%4 =!)&for %%3 in (!tmp3!) do ((set tmp2=!tmp3:%%3 =!)&for %%2 in (!tmp2!) do ((set tmp1=!tmp2:%%2 =!)&for /f "delims=" %%1 in ("!tmp1:%%2=!") do echo %%5 %%4 %%3 %%2 %%1 ))))
  3. pause
复制代码

TOP

噢,发现27楼代码就是6楼代码,只是21楼代码是对这种思路的改进

TOP

32楼用偏移的办法确实更好,如果是8个排列项,那这种方法就避开了!7次的set和for /l,从而弥补了for /f频繁读写对效率的影响,这种用for /f从文件读取的思路真是太妙了

TOP

建议把临时文件名改为纯数字,这样每次循环还可以省去两个set

TOP

返回列表