private String compute(String[] input) {
		if (input.length != 3)
			return "Error: Invalid input!";

		if (input[2].contains("/ 0"))
			return "Division by zero not supported!";

		String[] termParts = input[2].split(" ");

		if ((termParts.length / 2) * 50 > userMap.get(input[1]).getCredits())
			return "Error: Not enough credits!";

		Integer usedCredits = (termParts.length / 2) * 50;

		try {
			// Set the cursor on the first part of the main term
			Integer cursor = Integer.parseInt(termParts[0]);

			for (int i = 1; i < termParts.length; i++) {
				// Find the best appropriate node
				NodeData node = nodeMap.getBestNode(termParts[i]);
				// If there is no node that supports the operation, error
				if (node == null)
					return "Error: " + termParts[i] + " is unsupported!";

				// Set our tempResult
				String tempResult = null;

				tempResult = sendToNode(node, "compute_" + cursor + "_" + termParts[i] + "_" + termParts[i + 1]);

				if (tempResult != null) {
					/*
					 * Replace cursor with the tempResult, provided it is not null so semi-recursion can continue
					 */
					cursor = Integer.parseInt(tempResult);

					/*
					 * Increase node usage after successful calculation, check if negative first
					 */
					if (tempResult.startsWith("-"))
						nodeMap.get(node.getKey()).incUsage(50 * (tempResult.length() - 1));
					else
						nodeMap.get(node.getKey()).incUsage(50 * tempResult.length());
				} else {
					/*
					 * Calculation failed, node set to offline and credits decremented by 50 for failed operation
					 */
					nodeMap.get(node.getKey()).setAlive(false);
					usedCredits -= 50;
				}

				// Jump to the next operation
				i++;
			}

			// Decrement the user calculating by the number of credits paid
			userMap.get(input[1]).decCredits(usedCredits);

			return cursor.toString();
		} catch (NumberFormatException e) {
			return "Error: Input can only contain valid integers!";
		}
	}