📖 Scenario: You are working on a simple Kotlin program that generates sequences of numbers for a math quiz app. You want to practice creating sequences using different Kotlin sequence creation methods.
🎯 Goal: Build a Kotlin program that creates sequences using sequenceOf, generateSequence, and sequence builder, then prints the sequences.
📋 What You'll Learn
Create a sequence of fixed numbers using sequenceOf
Create an infinite sequence of even numbers using generateSequence
Create a sequence of squares of numbers from 1 to 5 using sequence builder
Print all sequences to show their contents
💡 Why This Matters
🌍 Real World
Sequences are useful when you want to work with potentially large or infinite data sets without loading everything into memory at once.
💼 Career
Understanding Kotlin sequences helps in writing efficient and clean code for Android apps and backend services that process streams of data.
Progress0 / 4 steps
1
Create a fixed sequence using sequenceOf
Create a sequence called fixedSequence using sequenceOf with these exact numbers: 3, 6, 9, 12.
Kotlin
Hint
Use val fixedSequence = sequenceOf(3, 6, 9, 12) to create the sequence.
2
Create an infinite sequence of even numbers using generateSequence
Create a sequence called evenSequence using generateSequence that starts at 0 and adds 2 each time.
Kotlin
Hint
Use val evenSequence = generateSequence(0) { it + 2 } to create the sequence.
3
Create a sequence of squares from 1 to 5 using sequence builder
Create a sequence called squareSequence using the sequence builder that yields squares of numbers from 1 to 5.
Kotlin
Hint
Use sequence { for (i in 1..5) { yield(i * i) } } to create the sequence.
4
Print all sequences
Print the contents of fixedSequence, the first 5 elements of evenSequence, and squareSequence using println. Use toList() to convert sequences to lists for printing.
Kotlin
Hint
Use println(fixedSequence.toList()), println(evenSequence.take(5).toList()), and println(squareSequence.toList()).
Practice
(1/5)
1. Which of the following is the correct way to directly create a sequence from a fixed set of values in Kotlin?
easy
A. val seq = sequenceOf(1, 2, 3)
B. val seq = listOf(1, 2, 3).asSequence()
C. val seq = arrayOf(1, 2, 3).toSequence()
D. val seq = sequence(1, 2, 3)
Solution
Step 1: Understand sequence creation from fixed values
The function sequenceOf() creates a sequence directly from given values.
Step 2: Check each option's validity
val seq = sequenceOf(1, 2, 3) uses sequenceOf(1, 2, 3), which is correct. val seq = listOf(1, 2, 3).asSequence() creates a list then converts to sequence, which is valid but not direct creation. val seq = arrayOf(1, 2, 3).toSequence() uses a non-existent toSequence() method on array, which is invalid. val seq = sequence(1, 2, 3) uses sequence() which is not a valid function for this purpose.
Final Answer:
val seq = sequenceOf(1, 2, 3) -> Option A
Quick Check:
Direct sequence creation = sequenceOf(...) [OK]
Hint: Use sequenceOf() to create sequences from fixed values [OK]
Common Mistakes:
Using non-existent toSequence() on arrays
Confusing sequenceOf() with sequence()
Trying to create sequence directly from array without conversion
2. Which of the following is the correct syntax to create a sequence from a range in Kotlin?
easy
A. val seq = (1..5).toSequence()
B. val seq = sequence(1..5)
C. val seq = (1..5).asSequence()
D. val seq = sequenceOf(1..5)
Solution
Step 1: Identify how to convert a range to a sequence
Ranges in Kotlin can be converted to sequences using the asSequence() extension function.
Step 2: Evaluate each option's syntax
val seq = (1..5).asSequence() uses (1..5).asSequence(), which is correct. val seq = (1..5).toSequence() uses toSequence() which does not exist for ranges. val seq = sequence(1..5) uses sequence(1..5) which is invalid syntax. val seq = sequenceOf(1..5) creates a sequence of a single range object, not elements.
Final Answer:
val seq = (1..5).asSequence() -> Option C
Quick Check:
Range to sequence = asSequence() [OK]
Hint: Use asSequence() to convert ranges to sequences [OK]
Common Mistakes:
Using toSequence() which does not exist
Passing range directly to sequence() function
Using sequenceOf() with a range as single element
3. What will be the output of the following Kotlin code?
val seq = generateSequence(1) { it + 2 }.take(4).toList()
println(seq)
medium
A. [1, 3, 5, 7]
B. [1, 2, 3, 4]
C. [2, 4, 6, 8]
D. [1, 3, 5]
Solution
Step 1: Understand generateSequence with lambda
The sequence starts at 1, then each next element is previous + 2, so elements are 1, 3, 5, 7, ...
Step 2: Apply take(4) and convert to list
Taking first 4 elements gives [1, 3, 5, 7]. Printing this list outputs exactly that.
Final Answer:
[1, 3, 5, 7] -> Option A
Quick Check:
Sequence increments by 2 starting at 1 = [1, 3, 5, 7] [OK]
Forgetting to convert sequence to list before printing
4. Identify the error in the following Kotlin code that tries to create a sequence of even numbers starting from 2:
val seq = generateSequence(2) { it + 2 }
val firstThree = seq.take(3).toList()
println(firstThree)
medium
A. generateSequence requires a nullable lambda return type
B. take() does not exist for sequences
C. toList() cannot be called on a sequence
D. No error; code works correctly
Solution
Step 1: Check generateSequence usage
The code uses generateSequence with a start value and lambda to add 2 each time, which is valid.
Step 2: Verify take() and toList() usage
Sequences support take() to limit elements and toList() to convert to list. Both are valid here.
Final Answer:
No error; code works correctly -> Option D
Quick Check:
generateSequence + take + toList = valid sequence creation [OK]
Hint: generateSequence with non-null lambda works fine [OK]
Common Mistakes:
Thinking lambda must return nullable type
Believing toList() is invalid on sequences
Assuming take() is not available for sequences
5. You want to create a sequence of Fibonacci numbers up to 100 using generateSequence. Which of the following code snippets correctly implements this?
hard
A.
val fibSeq = generateSequence(0) { it + it - 1 }
val result = fibSeq.takeWhile { it <= 100 }.toList()
B.
val fibSeq = generateSequence(Pair(0, 1)) { (a, b) -> if (b <= 100) Pair(b, a + b) else null }
val result = fibSeq.map { it.first }.toList()
C.
val fibSeq = sequenceOf(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144)
val result = fibSeq.filter { it <= 100 }.toList()
D.
val fibSeq = generateSequence(0 to 1) { (a, b) -> Pair(b, a + b) }
val result = fibSeq.map { it.second }.takeWhile { it <= 100 }.toList()
Solution
Step 1: Understand Fibonacci sequence generation with generateSequence
We use a Pair to hold two consecutive Fibonacci numbers. The lambda returns next pair if next number is ≤ 100, else null to stop.
Step 2: Analyze each option
val fibSeq = generateSequence(Pair(0, 1)) { (a, b) -> if (b <= 100) Pair(b, a + b) else null }
val result = fibSeq.map { it.first }.toList()
correctly uses Pair and stops at 100, then maps to first element for Fibonacci numbers.
val fibSeq = generateSequence(0) { it + it - 1 }
val result = fibSeq.takeWhile { it <= 100 }.toList()
uses incorrect formula.
val fibSeq = sequenceOf(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144)
val result = fibSeq.filter { it <= 100 }.toList()
hardcodes values but includes 144 which is > 100.
val fibSeq = generateSequence(0 to 1) { (a, b) -> Pair(b, a + b) }
val result = fibSeq.map { it.second }.takeWhile { it <= 100 }.toList()
maps to second element and takes while ≤ 100, but first element 0 is missed and sequence never stops (infinite).
Final Answer:
generateSequence(Pair(0, 1)) { (a, b) -> if (b <= 100) Pair(b, a + b) else null }.map { it.first }.toList() -> Option B
Quick Check:
generateSequence with Pair and null stop = correct Fibonacci [OK]
Hint: Use Pair and null to stop generateSequence for Fibonacci [OK]
Common Mistakes:
Not stopping sequence with null when limit exceeded
Incorrect Fibonacci formula in lambda
Including numbers beyond limit in hardcoded sequences
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.