I'm not convinced that what you are doing really makes sense, but I did see the recursive pattern in your code and I believe that this is how you can refactor it. First of all, we create a method that you can call recursively: void DoSomething(int index) { for (Pointers[index] = 0; Pointers[index] < 8; Pointers[index]++) { if (AdjM[Pointers[index], Pointers[index - 1]]) if (Pointers[index] == VertEnd) AddPath(index + 1); if (index < 7) { DoSomething(index + 1); } } } Then, unfortunately, the outermost loop did not completely match this pattern so the first loop remains, but it can be used to call the second: for (Pointers[0] = 0; Pointers[0] < 8; Pointers[0]++) if (AdjM[Pointers[0], VertStart + 0]) { DoSomething(1); } A few other notes: - It is recommended to always use braces - Your number '8' is a 'magic number'. That should be extracted to a constant.