Published

## Algorithm goal

Add two numbers without using addition (+ sign). Can be done with bitwise operations.

For example, 5 + 3 is 8; in binary it is 101 + 011 = 1000.

## Test cases in Scala

``````assert(add(0, 0) == 0)
assert(
add(Int.MaxValue / 2, Int.MaxValue / 2) == (Int.MaxValue / 2) +
(Int.MaxValue / 2),
"We can sum the largest pair of numbers"
)
assert(
{
val ra = scala.util.Random.nextInt(1000000)
val rb = scala.util.Random.nextInt(1000000)
add(ra, rb) == ra + rb
},
"Random pair of digits add up"
)
``````

## Algorithm in Scala

20 lines of Scala (compatible versions 2.13 & 3.0), showing how concise Scala can be!

## Explanation

Recommended to draw out a table of additions: from the table you learn that binary addition uses the same principles of carrying a number when the base (in this case 2) is exceeded (eg 0b1 + 0b1 = 0b10, and 0b11 + 0b01 = 0b10 + 0b10 = 0b100).

The key tasks here are to add up the number bit-wise, while considering the possibility of a carry-number. (this is © from www.scala-algorithms.com)

## Scala concepts & Hints

1. ### Def Inside Def

A great aspect of Scala is being able to declare functions inside functions, making it possible to reduce repetition.

``````def exampleDef(input: String): String = {
def surroundInputWith(char: Char): String = s"\$char\$input\$char"
surroundInputWith('-')
}

assert(exampleDef("test") == "-test-")
``````

It is also frequently used in combination with Tail Recursion.

2. ### Stack Safety

Stack safety is present where a function cannot crash due to overflowing the limit of number of recursive calls.

This function will work for n = 5, but will not work for n = 2000 (crash with java.lang.StackOverflowError) - however there is a way to fix it :-)

In Scala Algorithms, we try to write the algorithms in a stack-safe way, where possible, so that when you use the algorithms, they will not crash on large inputs. However, stack-safe implementations are often more complex, and in some cases, overly complex, for the task at hand.

``````def sum(from: Int, until: Int): Int =
if (from == until) until else from + sum(from + 1, until)

def thisWillSucceed: Int = sum(1, 5)

def thisWillFail: Int = sum(1, 300)
``````
3. ### Tail Recursion

In Scala, tail recursion enables you to rewrite a mutable structure such as a while-loop, into an immutable algorithm.

``````def fibonacci(n: Int): Int = {
@scala.annotation.tailrec
def go(i: Int, previous: Int, beforePrevious: Int): Int =
if (i >= n) previous else go(i + 1, previous + beforePrevious, previous)

go(i = 1, previous = 1, beforePrevious = 0)
}

assert(fibonacci(8) == 21)
``````

# Scala Algorithms: The most comprehensive library of algorithms in standard pure-functional Scala

## Think in Scala & master the highest paid programming language in the US

Scala is used at many places, such as AirBnB, Apple, Bank of America, BBC, Barclays, Capital One, Citibank, Coursera, eBay, JP Morgan, LinkedIn, Morgan Stanley, Netflix, Singapore Exchange, Twitter.

### Study our 92 Scala Algorithms: 6 fully free, 74 published & 18 upcoming

Fully unit-tested, with explanations and relevant concepts; new algorithms published about once a week.

### Explore the 21 most useful Scala concepts

To save you going through various tutorials, we cherry-picked the most useful Scala concepts in a consistent form.