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

[特效代码] 用goto实现的递归-生成n进制数

批处理用 call 很容易实现递归, 但速度会很慢
用 goto 实现递归, 需要自行建立各种堆栈, 在适当时操作压栈, 弹栈

本例 用 goto 生成 若干位的 n进制数,  位数和进制都是可调的

本例生成4位的所有三进制数, 从 0000 到 2222 相当于10进制的 0 -- 80[3^4-1],  数字序列如下:
  1. 0000, 0001, 0002, 0010, 0011, 0012, 0020, 0021, 0022, 0100, 0101, 0102, 0110, 0111, 0112, 0120, 0121, 0122, 0200, 0201, 0202, 0210, 0211, 0212, 0220, 0221, 0222, 1000, 1001, 1002, 1010, 1011, 1012, 1020, 1021, 1022, 1100, 1101, 1102, 1110, 1111, 1112, 1120, 1121, 1122, 1200, 1201, 1202, 1210, 1211, 1212, 1220, 1221, 1222, 2000, 2001, 2002, 2010, 2011, 2012, 2020, 2021, 2022, 2100, 2101, 2102, 2110, 2111, 2112, 2120, 2121, 2122, 2200, 2201, 2202, 2210, 2211, 2212, 2220, 2221, 2222
复制代码
  1. @echo off & setlocal enabledelayedexpansion
  2. REM 初始状态
  3. set /a bitind=4, istep=-1
  4. :enter
  5.     if !bitind! leq 0 (
  6.         echo;!B4!!B3!!B2!!B1!
  7.         set /a "bitind=!bitindSt:~-1!, istep=!istepSt:~-1!"
  8.         set "bitindSt=!bitindSt:~0,-1!
  9.         set "istepSt=!istepSt:~0,-1!
  10.         goto :enter
  11.     ) else (
  12.         if !istep! lss 2 (
  13.             set /a "istep+=1"
  14.             set "B!bitind!=!istep!"
  15.             set "bitindSt=!bitindSt!!bitind!"
  16.             set "istepSt=!istepSt!!istep!"
  17.             set /a "bitind-=1, istep=-1"
  18.             goto :enter
  19.         ) else (
  20.             if "!bitindSt!"=="" (
  21.                 goto :complete
  22.             ) else (
  23.                 set /a "bitind=!bitindSt:~-1!, istep=!istepSt:~-1!"
  24.                 set "bitindSt=!bitindSt:~0,-1!
  25.                 set "istepSt=!istepSt:~0,-1!
  26.                 goto :enter
  27.             )
  28.         )
  29.     )
  30. :complete
  31. pause
复制代码

返回列表