A recursive enumeration is an enum that can have cases which refer to the enum itself, allowing the creation of complex, nested data structures like trees or linked lists.
Click to reveal answer
beginner
Why do you need to mark an enum case as indirect in Swift?
You mark an enum case as indirect to tell Swift that the case stores a reference to the enum itself, enabling recursion and preventing infinite size issues.
Click to reveal answer
intermediate
How do you define a recursive enumeration for a simple arithmetic expression in Swift?
You define enum cases for numbers and operations, marking the operation cases as indirect so they can hold other expressions recursively.
Click to reveal answer
intermediate
What is the difference between marking the whole enum as indirect versus marking individual cases as indirect?
Marking the whole enum as indirect makes all cases recursive by default, while marking individual cases only makes those specific cases recursive.
Click to reveal answer
beginner
Give an example use case for recursive enumerations.
Recursive enumerations are useful for representing data structures like trees, linked lists, or nested expressions where elements can contain other elements of the same type.
Click to reveal answer
What keyword do you use in Swift to make an enum case recursive?
Aindirect
Brecursive
Cmutating
Ddynamic
✗ Incorrect
The keyword indirect tells Swift that the enum case can hold a reference to the enum itself, enabling recursion.
Which of these is a valid reason to use recursive enumerations?
ATo improve performance of loops
BTo handle user input
CTo create global variables
DTo represent nested data like trees
✗ Incorrect
Recursive enumerations are perfect for nested data structures such as trees or linked lists.
If you mark the whole enum as indirect, what happens?
AThe enum cannot be recursive
BOnly the first case is recursive
CAll cases become recursive by default
DThe enum becomes a class
✗ Incorrect
Marking the whole enum as indirect makes every case recursive automatically.
What problem does marking enum cases as indirect solve?
APrevents infinite size by using references
BAllows enums to inherit from classes
CEnables enums to have stored properties
DMakes enums mutable
✗ Incorrect
It prevents infinite size issues by storing references instead of values directly.
Which of these is NOT a typical use of recursive enumerations?
ARepresenting linked lists
BRepresenting flat arrays
CRepresenting nested expressions
DRepresenting binary trees
✗ Incorrect
Flat arrays do not require recursion; recursive enumerations are for nested or self-referential data.
Explain what a recursive enumeration is and why the indirect keyword is important in Swift.
Think about how enums can refer to themselves and what Swift needs to handle that.
You got /3 concepts.
Describe a simple example of a recursive enumeration in Swift and how it can represent nested data.
Consider an enum for math expressions with numbers and operations.
You got /3 concepts.
Practice
(1/5)
1. What does the indirect keyword do in a Swift recursive enumeration?
easy
A. It allows the enum to refer to itself recursively.
B. It makes the enum immutable.
C. It converts the enum into a class.
D. It prevents the enum from being used in switch statements.
Solution
Step 1: Understand the role of indirect
The indirect keyword tells Swift that the enum cases can hold references to the enum itself, enabling recursion.
Step 2: Identify what recursion means in enums
Recursion means an enum case can contain another instance of the same enum, which requires indirect to avoid infinite size.
Final Answer:
It allows the enum to refer to itself recursively. -> Option A
Quick Check:
indirect enables recursion = C [OK]
Hint: Remember: indirect means self-reference allowed [OK]
Common Mistakes:
Thinking indirect makes enum immutable
Confusing indirect with class conversion
Believing indirect disables switch usage
2. Which of the following is the correct syntax to declare a recursive enum case in Swift?
easy
A. enum Tree { case leaf(Int); indirect case node(Tree, Tree) }
B. enum Tree { case leaf(Int); case node(Tree, Tree) }
C. enum Tree { indirect case leaf(Int); case node(Tree, Tree) }
D. indirect enum Tree { case leaf(Int); case node(Tree, Tree) }
Solution
Step 1: Recall how to declare recursive enums
Swift allows marking the whole enum as indirect to enable recursion for all cases.
Step 2: Check each option's syntax
The syntax indirect enum Tree { case leaf(Int); case node(Tree, Tree) } correctly enables recursion by marking the whole enum indirect. Other options either lack the keyword, apply it only to non-recursive cases (leaving recursive case without), or contain syntax errors such as missing the case keyword.
Final Answer:
indirect enum Tree { case leaf(Int); case node(Tree, Tree) } -> Option D
Quick Check:
Whole enum indirect = A [OK]
Hint: Use 'indirect enum' for all recursive cases [OK]
Common Mistakes:
Omitting indirect keyword
Placing indirect only on some cases incorrectly
Using indirect outside enum declaration
3. Given the recursive enum below, what is the output of print(tree.countLeaves())?
indirect enum Tree {
case leaf(Int)
case node(Tree, Tree)
func countLeaves() -> Int {
switch self {
case .leaf(_): return 1
case let .node(left, right):
return left.countLeaves() + right.countLeaves()
}
}
}
let tree = Tree.node(.leaf(1), Tree.node(.leaf(2), .leaf(3)))
medium
A. 1
B. 2
C. 3
D. 4
Solution
Step 1: Understand the tree structure
The tree is: node(leaf(1), node(leaf(2), leaf(3))). It has three leaves: 1, 2, and 3.
Step 2: Count leaves recursively
The countLeaves function returns 1 for each leaf and sums counts for nodes. So total leaves = 1 + (1 + 1) = 3.
Final Answer:
3 -> Option C
Quick Check:
Leaves counted = 3 [OK]
Hint: Count leaf nodes recursively for total leaves [OK]
Common Mistakes:
Counting nodes instead of leaves
Misunderstanding recursive calls
Forgetting to sum both sides
4. Identify the error in this recursive enum declaration:
enum List {
case end
case node(Int, List)
}
medium
A. Missing indirect keyword for recursion.
B. Enum cases cannot have associated values.
C. The enum must be a class to be recursive.
D. The case end should have an associated value.
Solution
Step 1: Check for recursion support
The enum List has a case node(Int, List) which refers to itself, so it is recursive.
Step 2: Verify use of indirect
Swift requires marking recursive enums or cases with indirect. This enum lacks it, causing a compile error.
Final Answer:
Missing indirect keyword for recursion. -> Option A
Quick Check:
Recursive enum needs indirect = B [OK]
Hint: Add indirect to recursive enums or cases [OK]
Common Mistakes:
Ignoring indirect keyword requirement
Thinking recursion needs classes
Assuming all enum cases need associated values
5. How would you modify this recursive enum to safely calculate the depth of a tree, returning 0 for leaves and the maximum depth for nodes?
indirect enum Tree {
case leaf(Int)
case node(Tree, Tree)
func depth() -> Int {
// Your code here
}
}
hard
A. Return 1 for leaf, and sum depths of left and right nodes.
B. Return 0 for leaf, and 1 + max depth of left and right nodes.
C. Return 0 for leaf, and sum depths of left and right nodes.
D. Return 1 for leaf, and 1 + min depth of left and right nodes.
Solution
Step 1: Define depth for leaf nodes
Leaves have depth 0 because they have no children.
Step 2: Define depth for node cases
Nodes have depth 1 plus the maximum depth of their two child trees.
Final Answer:
Return 0 for leaf, and 1 + max depth of left and right nodes. -> Option B