Skip to content

Commit fef0b95

Browse files
authored
Add moser-de bruijin sequence (#255)
1 parent 75b99a2 commit fef0b95

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// The Moser-de Bruijn sequence is the sequence obtained by
2+
// adding up the distinct powers of the number 4 (For example 1, 4, 16, 64, etc).
3+
// You can get more details on https://en.wikipedia.org/wiki/Moser%E2%80%93de_Bruijn_sequence.
4+
5+
package moserdebruijnsequence
6+
7+
func MoserDeBruijnSequence(number int) []int {
8+
sequence := []int{}
9+
10+
for i := 0; i < number; i++ {
11+
res := generateNthTerm(i)
12+
sequence = append(sequence, res)
13+
}
14+
15+
return sequence
16+
}
17+
18+
func generateNthTerm(num int) int {
19+
if num == 0 || num == 1 {
20+
return num
21+
}
22+
23+
//number is even
24+
if num%2 == 0 {
25+
return 4 * generateNthTerm(num/2)
26+
}
27+
28+
//number is odd
29+
if num%2 != 0 {
30+
return 4*generateNthTerm(num/2) + 1
31+
}
32+
33+
return 0
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package moserdebruijnsequence
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
var testCases = []struct {
9+
name string
10+
inputNum int
11+
expected []int
12+
}{
13+
{"first 15 terms", 15, []int{0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84}},
14+
}
15+
16+
func TestMoserDeBruijnSequence(t *testing.T) {
17+
18+
for _, test := range testCases {
19+
t.Run(test.name, func(t *testing.T) {
20+
if output := MoserDeBruijnSequence(test.inputNum); !reflect.DeepEqual(output, test.expected) {
21+
t.Errorf("For input: %d, expected: %v, but got: %v", test.inputNum, test.expected, output)
22+
}
23+
})
24+
}
25+
}

0 commit comments

Comments
 (0)