public void AddNumbers() { var result = _numbers[0]; foreach (var operand in _numbers.Skip(1)) { bool reduced = false; var sum = new SnailFishNumber(result, operand); var visitor = new ReorderRegularNumberVisitor(); sum.Accept(visitor); do { reduced = false; var exploder = new SnailFishNumberExploder(sum); if (exploder.CanReduce()) { sum = exploder.Apply(); reduced = true; } else { var splitter = new SnailFishNumberSplitter(sum); if (splitter.CanReduce()) { sum = splitter.Apply(); reduced = true; } } }while (reduced); result = sum; } Result = result; }