namespace algorithm_simple_csharp
static void Main(string[] args)
Console.WriteLine("Working on it!");
int[] allNumbers = new int[] {1,2,3,4};
OperationTreeNode firstPositiveNode = new OperationTreeNode
currentNumber = allNumbers[initIndex],
accumulativeSum = allNumbers[initIndex],
int totalSolutionsPositiveFirst = ApplyNumber(firstPositiveNode, allNumbers, initIndex + 1, desiredSum);
OperationTreeNode firstNegativeNode = new OperationTreeNode
currentNumber = -allNumbers[initIndex],
accumulativeSum = -allNumbers[initIndex],
int totalSolutionsNegativeFirst = ApplyNumber(firstNegativeNode, allNumbers, initIndex + 1, desiredSum);
Console.WriteLine("Total sultions: " + (totalSolutionsPositiveFirst + totalSolutionsNegativeFirst));
static int ApplyNumber(OperationTreeNode currentNode, int[] allNumbers, int index, int desiredSum)
if(index > allNumbers.GetUpperBound(0))
if(currentNode.accumulativeSum == desiredSum)
Console.WriteLine(currentNode.BranchToString() + " = " + currentNode.accumulativeSum + " <--- THIS ONE");
Console.WriteLine(currentNode.BranchToString() + " = " + currentNode.accumulativeSum);
OperationTreeNode plusNode = new OperationTreeNode
parentNode = currentNode,
currentNumber = allNumbers[index],
accumulativeSum = currentNode.accumulativeSum + allNumbers[index],
int totalSolutionsWithPlus = ApplyNumber(plusNode, allNumbers, index +1, desiredSum);
OperationTreeNode minusNode = new OperationTreeNode
parentNode = currentNode,
currentNumber = allNumbers[index],
accumulativeSum = currentNode.accumulativeSum - allNumbers[index],
int totalSolutionsWithMinus = ApplyNumber(minusNode, allNumbers, index +1, desiredSum);
return totalSolutionsWithPlus + totalSolutionsWithMinus;
public class OperationTreeNode
public int accumulativeSum = 0;
public OperationTreeNode parentNode = null;
public int currentNumber = 0;
public string BranchToString()
return $"{this.currentNumber} ";
return $"{parentNode.BranchToString()} {this.operation} {this.currentNumber} ";