偶然的眼光中,提出了两个问题,其中一个问题是当维数增加时怎办?
有4个步骤,我们可以用一个4维循环来尝试完所有方法;如果是n个步骤,我们当然可以写一个n维循环来解决问题;
不过这种做法存在几个缺点:

  1. 每次当增加一个步骤时,原来的代码需要修改;而我们知道,代码一旦要修改,就可能引入新的bug
  2. 当步骤个数增多到某个大数时,比如100,代码就会显得很臃肿
    很显然,此种方法扩展性不好

那么有无更好的方法呢?这里用python给出一个尝试:

  1. 描述所有steps
    假设steps是个list,用来存放所有的步骤
    steps=【step100,step99,…,steps2,step1】
  2. 描述单个step,比如step1
    正如前所述,step1有3个value,M1,M2,M3;那么step1也可以用一个list描述
    step1=【M1,M2,M3】
    类似的,我们可以描述其他的stepi,1<=i<=100
    step2=【N1】
    step3=【L1,L2】
    step4=【O1,O2,O3】
  3. 遍历所有的steps组合
    1 def doit(steplist)
    2     if steplist为空:
    3         return;
    4     else:
    5         i=steplist.pop()      //出栈
    6         for j in i:
    7             调用 j
    8             doit(steplist)
    9         steplist.push(i)      //压栈

可见,按照doit方式实现的code,代码显得非常elegant,每次增加steps,doit这块的代码不需要改动;需要做的事情有两项

  • 仅需要增加一个stepi描述,
  • 和在steps列表合适位置增加一个stepi。

doit是可以定制的;一般而言,每个step之间均会有参数依赖关系,所以有时如果需要将所有steps汇聚在doit的同一层(大多数情况下,也就是最后一层)执行,可以为doit添加一个新list参数loops,上述第7行代码换为“loops.append(j)”,然后在2和3行之间插入依次调用loops【i】的code

总结:

通过一个递归的doit,实现了对n维循环的抽象,形象的可以看成是对纵向循环的有效描述。

Advertisements