Skip to content

Commit c95d8aa

Browse files
authored
Add recursive kolakoski sequence (TheAlgorithms#279)
1 parent 52180d5 commit c95d8aa

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

Algorithms.Tests/Numeric/MillerRabinPrimalityTest.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ namespace Algorithms.Tests.Numeric
77
{
88
public static class MillerRabinPrimalityTest
99
{
10-
[Test]
1110
[TestCase("7", ExpectedResult = true)] // true
1211
[TestCase("47", ExpectedResult = true)] // true
1312
[TestCase("247894109041876714378152933343208766493", ExpectedResult = true)] // true
1413
[TestCase("315757551269487563269454472438030700351", ExpectedResult = true)] // true
1514

16-
[TestCase("2476099", ExpectedResult = false)] // false 19^5
15+
[TestCase("2476099", ExpectedResult = false)] // false 19^5
1716
// false 247894109041876714378152933343208766493*315757551269487563269454472438030700351
1817
[TestCase("78274436845194327170519855212507883195883737501141260366253362532531612139043", ExpectedResult = false)]
1918
public static bool MillerRabinPrimalityWork(String testcase)
@@ -31,7 +30,6 @@ public static bool MillerRabinPrimalityWork(String testcase)
3130
return result;
3231
}
3332

34-
[Test]
3533
[TestCase("-2")]
3634
[TestCase("0")]
3735
[TestCase("3")]

Algorithms.Tests/Sequences/KolakoskiSequenceTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ public void First100ElementsCorrect()
2727
};
2828

2929
var sequence = new KolakoskiSequence().Sequence.Take(100);
30+
var sequence2 = new KolakoskiSequence2().Sequence.Take(100);
3031

3132
sequence.Should().Equal(expected);
33+
sequence2.Should().Equal(expected);
3234
}
3335
}
3436
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Numerics;
4+
5+
namespace Algorithms.Sequences
6+
{
7+
/// <summary>
8+
/// <para>
9+
/// Kolakoski sequence; n-th element is the length of the n-th run in the sequence itself.
10+
/// </para>
11+
/// <para>
12+
/// Wikipedia: https://en.wikipedia.org/wiki/Kolakoski_sequence.
13+
/// </para>
14+
/// <para>
15+
/// OEIS: https://oeis.org/A000002.
16+
/// </para>
17+
/// </summary>
18+
public class KolakoskiSequence2 : ISequence
19+
{
20+
/// <summary>
21+
/// Gets Kolakoski sequence.
22+
/// </summary>
23+
public IEnumerable<BigInteger> Sequence
24+
{
25+
get
26+
{
27+
yield return 1;
28+
yield return 2;
29+
yield return 2;
30+
31+
var inner = new KolakoskiSequence2().Sequence.Skip(2);
32+
var nextElement = 1;
33+
foreach (var runLength in inner)
34+
{
35+
yield return nextElement;
36+
if (runLength > 1)
37+
{
38+
yield return nextElement;
39+
}
40+
41+
nextElement = 1 + nextElement % 2;
42+
}
43+
}
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)