diff --git a/curriculum/challenges/english/08-coding-interview-prep/project-euler/problem-14-longest-collatz-sequence.english.md b/curriculum/challenges/english/08-coding-interview-prep/project-euler/problem-14-longest-collatz-sequence.english.md
index 4ae420e75a..22c14a2423 100644
--- a/curriculum/challenges/english/08-coding-interview-prep/project-euler/problem-14-longest-collatz-sequence.english.md
+++ b/curriculum/challenges/english/08-coding-interview-prep/project-euler/problem-14-longest-collatz-sequence.english.md
@@ -48,6 +48,8 @@ tests:
testString: assert.strictEqual(longestCollatzSequence(54512), 52527);
- text: longestCollatzSequence(100000)
should return 77031.
testString: assert.strictEqual(longestCollatzSequence(100000), 77031);
+ - text: longestCollatzSequence(1000000)
should return 837799.
+ testString: assert.strictEqual(longestCollatzSequence(1000000), 837799);
```
@@ -79,33 +81,28 @@ longestCollatzSequence(14);
```js
function longestCollatzSequence(limit) {
- let longestSequenceLength = 0;
- let startingNum = 0;
-
- function sequenceLength(num) {
- let length = 1;
-
- while (num >= 1) {
- if (num === 1) { break;
- } else if (num % 2 === 0) {
- num = num / 2;
- length++;
- } else {
- num = num * 3 + 1;
- length++;
- }
- }
- return length;
- }
-
- for (let i = 2; i < limit; i++) {
- let currSequenceLength = sequenceLength(i);
- if (currSequenceLength > longestSequenceLength) {
- longestSequenceLength = currSequenceLength;
- startingNum = i;
+ let longest = 1;
+ let maxLength = 1;
+ for (let i = Math.floor(limit / 2); i < limit; i++) {
+ let len = colLen(i);
+ if (len > maxLength) {
+ longest = i;
+ maxLength = len;
}
}
- return startingNum;
+ return longest;
+}
+
+const knownSequence = { '1': 1 };
+
+function colLen(n) {
+ if (knownSequence[n]) {
+ return knownSequence[n];
+ } else {
+ const len = n % 2 === 0 ? colLen(n / 2) + 1 : colLen((3 * n + 1) / 2) + 2;
+ knownSequence[n] = len;
+ return len;
+ }
}
```