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

这个很短小。
  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
复制代码
这个代码可精简为:
  1. @echo off&setlocal enabledelayedexpansion
  2. call:perm "a b c xy z"
  3. pause
  4. :perm <"c1 c2 ..."> // code by plp
  5. setlocal&set "s=%~1 "&if "!s: =!" == ""  (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"
复制代码
依据:
setlocal enabledelayedexpansion后,子过程会自动继承变量延迟开启,
call一个子过程,若setlcoal后,在结束该子过程时默认endlocal。。。
2

评分人数

TOP

本帖最后由 plp626 于 2011-5-22 09:30 编辑

这个兼容特殊字符
  1. @echo off
  2. call:perm "< & > plp |"
  3. pause
  4. :perm <"s1 s2 ...">
  5. setlocal enabledelayedexpansion&set "s= %~1"&for /f "tokens=*" %%a in ("%~1")do Set "ss=%%a"
  6. if "!s: =!" == ""  (echo "%~2 ") else for %%b in ("!ss: =" "!")do call:perm "!s: %%~b=!" "%~2 %%~b"
  7. endlocal&goto:eof
复制代码
这个可精简为:
  1. @echo off&setlocal enabledelayedexpansion
  2. call:perm "< & > plp |"
  3. pause
  4. :perm <"s1 s2 ...">
  5. setlocal&set "s= %~1"&for /f "tokens=*" %%a in ("%~1")do Set "ss=%%a"
  6. if "!s: =!" == ""  (echo "%~2 ") else for %%b in ("!ss: =" "!")do call:perm "!s: %%~b=!" "%~2 %%~b"
复制代码
依据:
setlocal enabledelayedexpansion后,子过程会自动继承变量延迟开启,
call一个子过程,若setlcoal后,在结束该子过程时默认endlocal。。。

TOP

16# zm900612

你首先得给问题找到一个递归关系(recursion case),然后确定初始态(base case),比如n!=n*(n-1)!光有这个递归关系还不行,一定得有个出发点,就是所谓的base case, 它是递归函数终止的标志。

再者,批处理的call又不完全同于C语言的函数,它必须加setlocal后才能保证函数内部变量不影响外部变量。。这会带来不少问题。。批处理的call==娱乐。。
=============================

怎么写完一个递归函数,你又怎么知道自己写的函数是正确的呢?
我引用宋劲彬的一段话:
如果你相信你正在写的递归函数是正确的,并调用它,然后在此基础上写完这个递归函数,那么它就会是正确的,从而值得你相信它正确。



看你说的那个整数划归问题,我还真不好找处一个递归关系。。。

TOP

本帖最后由 plp626 于 2011-5-22 09:25 编辑

批处理的makefunction 特性:(利用netben版主首创的内敛函数技巧)
  1. @echo off&setlocal EnableDelayedExpansion
  2. call:makefun _perm "a b c d xy"
  3. %_perm%
  4. pause&exit
  5. :makefun <funname> <"charlist">
  6. Set n=-1&Set s0=%~2&Set p=&set f=&for %%a in (%~2)do Set/a n+=1
  7. for /l %%a in (0 1 %n%)do (Set/a m=%%a+1
  8. Set "f=!f!&for %%%%a in (^!s%%a^!)do Set s!m!=^!s%%a:%%%%a=^!"
  9. Set p=!p! %%%%a)
  10. set %1=!f:~1,-15!ECHO !p!&goto:eof
复制代码
2

评分人数

    • zm900612: 顶一个,原来这就是内敛函数技术 + 1
    • wankoilz: 短小精致.技术 + 1

TOP

27# zm900612


注意看17楼第三个代码,我的和他的思路基本一致。。。

TOP

返回列表