嵌套for循环算法 - 动态

6 .net iteration algorithm loops dynamic

我有一个类似这样的算法:

for m = 1 to 2
  initialize(work_item(m))
  for l = 1 to 2
    initialize(work_item(l))
    for k = 1 to 2
      initialize(work_item(k))
      for j = 1 to 2
        initialize(work_item(j))
        for i = 1 to 2
          initialize(work_item(i))
          doSomething(work_item(i))
        next
        doSomething(work_item(j))
      next
      doSomething(work_item(k))
    next
    doSomething(work_item(l))
  next
  doSomething(work_item(m))
next

我如何迭代地编写它,使其成为动态的,这样我就不会将自己局限于固定数量的for循环(i,j,k,l,m)(即我可以做(i)或(i,j) )或(i,j,k)或(i,j,k,l)等......)?

(我正在用动态的,迭代的解决方案严格寻求答案.如果你不理解这一点,请继续阅读,从上一句开始.)

Bil*_*eal 9

完全像使用递归一样编写算法,但使用显式堆栈对象而不是递归.即:

var stack = new Stack();
stack.Push(InitialThingy);
while(stack.Count != 0)
{
    var currentItem = stack.Pop();
    //Do things to current item and add things to stack as we go.
}
Run Code Online (Sandbox Code Playgroud)

  • 就像我在你投票的问题中所说的那样,由于问题的性质,递归解决方案会更好.你为什么不想使用递归? (2认同)

cHa*_*Hao 6

private sub doStuff(depth as integer)
    for i as integer = 1 to 2
        initialize(work_item(i))
        if depth > 1 then doStuff(depth - 1)
        doSomething(work_item(i))
    next
end sub
Run Code Online (Sandbox Code Playgroud)

比任何迭代解决方案都更加优雅,简洁,不那么棘手.向我倾倒所有你想要的东西,并不会让它变得不那么真实.

  • PSH.原始代码是在VB中.只是想要有所帮助.:)此外,我有点像VB.它与C#最大的不同之处在于,它更啰嗦(我喜欢;`结束if:end while:end sub`更容易检查正确性而不是`}}}}).哦,并且它具有按照您的参考传递它们时所期望的属性. (2认同)

Jon*_*pan 3

您可能想要递归

  • 如果有特殊原因导致递归不适用于您,请说明。这正是递归最能解决的问题。任何名义上的迭代解决方案仍然是递归的;它最终会用堆栈结构(例如 C++“向量”)代替调用堆栈。 (5认同)