Bird
Raised Fist0
C Sharp (C#)programming~10 mins

Recursive pattern matching in C Sharp (C#) - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Recursive pattern matching
Start with input data
↓
Match pattern with 'match'
↓
If pattern matches base case
↓
Return base value
↓
Return
↓
Combine result
↓
Return
The function checks the input against patterns. If it matches a base case, it returns a value. Otherwise, it breaks input down and calls itself recursively, combining results.
Execution Sample
C Sharp (C#)
static int Factorial(int n) => n switch
{
  0 => 1,
  _ => n * Factorial(n - 1)
};
Calculates factorial of n using recursive pattern matching.
Execution Table
StepInput nPattern MatchedActionReturn Value
13Default (_)Calculate 3 * Factorial(2)Pending
22Default (_)Calculate 2 * Factorial(1)Pending
31Default (_)Calculate 1 * Factorial(0)Pending
40Base case (0)Return 11
51Return from recursion1 * 11
62Return from recursion2 * 12
73Return from recursion3 * 26
💡 Reached base case n=0, recursion unwinds returning final result 6
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5After Step 6Final
n33210123
Return ValueN/APendingPendingPending1126
Key Moments - 3 Insights
Why does the function call itself with n-1 instead of n?
Because the recursion needs to reach the base case (n=0). Calling with n-1 reduces the input step-by-step, as shown in execution_table steps 1 to 4.
Why is the base case pattern '0 => 1' important?
It stops the recursion by returning a value without further calls. Without it, the function would call itself forever. See step 4 in execution_table where base case returns 1.
What does the underscore (_) pattern mean in the match?
It matches any value not matched before (default case). Here it handles all n > 0, triggering recursive calls as in steps 1-3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the return value when n=1 (step 5)?
A2
B0
C1
DPending
💡 Hint
Check the 'Return Value' column at step 5 in execution_table
At which step does the base case pattern match?
AStep 4
BStep 1
CStep 7
DStep 3
💡 Hint
Look for 'Base case (0)' in the 'Pattern Matched' column in execution_table
If the base case was missing, what would happen to the execution?
ARecursion would stop immediately
BRecursion would continue infinitely causing a stack overflow
CFunction would return 0 for all inputs
DFunction would return 1 for all inputs
💡 Hint
Refer to key_moments explanation about the importance of the base case
Concept Snapshot
Recursive pattern matching uses 'switch' to check input.
Base case pattern returns a value directly.
Default pattern calls function recursively with smaller input.
Recursion continues until base case is reached.
Results combine as recursion unwinds.
Useful for problems like factorial, Fibonacci, tree traversal.
Full Transcript
This example shows recursive pattern matching in C#. The function Factorial uses a switch expression to check the input number n. If n is zero, it returns 1 immediately (base case). Otherwise, it calls itself with n-1 and multiplies the result by n. The execution table traces each call and return, showing how recursion breaks down the problem and then combines results. The variable tracker shows how n and return values change step-by-step. Key moments clarify why the base case is needed and what the underscore pattern means. The quiz tests understanding of return values, base case location, and recursion behavior without a base case.

Practice

(1/5)
1. What is the main purpose of recursive pattern matching in C#?
easy
A. To break down complex data structures step-by-step
B. To create loops that run forever
C. To declare variables without types
D. To handle exceptions automatically

Solution

  1. Step 1: Understand recursive pattern matching concept

    Recursive pattern matching is used to analyze data by breaking it down into smaller parts recursively.
  2. Step 2: Identify the purpose from options

    To break down complex data structures step-by-step correctly states that it breaks down complex data structures step-by-step, which matches the concept.
  3. Final Answer:

    To break down complex data structures step-by-step -> Option A
  4. Quick Check:

    Recursive pattern matching = step-by-step data breakdown [OK]
Hint: Think: recursive means breaking down data stepwise [OK]
Common Mistakes:
  • Confusing recursion with infinite loops
  • Thinking it declares variables
  • Assuming it handles exceptions
2. Which of the following is the correct syntax to use recursive pattern matching in a C# switch expression?
easy
A. case Node(var value, var next):
B. case Node[value, next]:
C. case Node->(value, next):
D. case Node[value; next]:

Solution

  1. Step 1: Recall C# recursive pattern syntax

    In C#, recursive patterns use parentheses with variables inside, like Node(var value, var next).
  2. Step 2: Compare options to correct syntax

    case Node(var value, var next): matches the correct syntax. Other options use invalid symbols like brackets or arrows.
  3. Final Answer:

    case Node(var value, var next): -> Option A
  4. Quick Check:

    Recursive pattern syntax uses parentheses ( ) [OK]
Hint: Look for parentheses with variables inside in case patterns [OK]
Common Mistakes:
  • Using square brackets instead of parentheses
  • Using arrows or semicolons incorrectly
  • Missing 'var' keyword before variables
3. What will be the output of this C# code snippet?
record Node(int Value, Node? Next);
Node list = new(1, new(2, new(3, null)));

string PrintList(Node? node) => node switch
{
null => "End",
Node(var v, var n) => $"{v} -> " + PrintList(n)
};

Console.WriteLine(PrintList(list));
medium
A. 1 2 3 End
B. End
C. 1 -> 2 -> 3 -> End
D. 1 -> 2 -> 3

Solution

  1. Step 1: Understand the recursive function PrintList

    PrintList prints the current node's value, then calls itself on the next node, until it reaches null and returns "End".
  2. Step 2: Trace the output for list nodes 1, 2, 3

    It prints "1 -> " + PrintList(2), then "2 -> " + PrintList(3), then "3 -> " + PrintList(null), which returns "End".
  3. Final Answer:

    1 -> 2 -> 3 -> End -> Option C
  4. Quick Check:

    Recursive print with null base case = 1 -> 2 -> 3 -> End [OK]
Hint: Follow recursion calls and base case carefully [OK]
Common Mistakes:
  • Ignoring the base case output
  • Missing arrows in output
  • Confusing spaces with arrows
4. Identify the error in this recursive pattern matching code:
record Node(int Value, Node? Next);
string PrintList(Node? node) => node switch
{
Node(var v, var n) => $"{v} -> " + PrintList(n),
null => "End"
};
medium
A. Missing semicolon after switch expression
B. No error, code works correctly
C. The pattern 'Node(var v, var n)' is invalid syntax
D. The order of cases should have 'null' before 'Node' to avoid errors

Solution

  1. Step 1: Check switch expression order and syntax

    In C#, switch expressions check patterns top to bottom. Here, 'Node' pattern matches non-null nodes, and 'null' matches null nodes. The order is valid.
  2. Step 2: Verify syntax correctness

    The pattern syntax and semicolons are correct. No syntax errors exist.
  3. Final Answer:

    No error, code works correctly -> Option B
  4. Quick Check:

    Pattern order and syntax are valid [OK]
Hint: Null pattern can be last in switch expressions [OK]
Common Mistakes:
  • Thinking null must come first
  • Assuming missing semicolon error
  • Misreading pattern syntax
5. Given a binary tree defined as:
record TreeNode(int Value, TreeNode? Left, TreeNode? Right);

Write a recursive pattern matching expression to calculate the sum of all values in the tree. Which of the following switch expressions correctly implements this?
hard
A. node switch { null => 0, TreeNode(v, l, r) => v + Sum(l) + Sum(r) }
B. node switch { TreeNode(v, l, r) => v + Sum(l) + Sum(r), null => 0 }
C. node switch { null => 0, TreeNode(var v, var l) => v + Sum(l) }
D. node switch { null => 0, TreeNode(var v, var l, var r) => v + Sum(l) + Sum(r) }

Solution

  1. Step 1: Understand the tree structure and sum logic

    The tree node has three parts: Value, Left, and Right. The sum should add the current value plus sums of left and right subtrees.
  2. Step 2: Check each option for correct pattern and order

    node switch { null => 0, TreeNode(var v, var l, var r) => v + Sum(l) + Sum(r) } correctly matches null first (base case) and then TreeNode with three variables (value, left, right). It sums value + Sum(left) + Sum(right). node switch { TreeNode(v, l, r) => v + Sum(l) + Sum(r), null => 0 } misses 'var' keywords, which is required. node switch { null => 0, TreeNode(v, l, r) => v + Sum(l) + Sum(r) } misses 'var' keywords, which is required. node switch { null => 0, TreeNode(var v, var l) => v + Sum(l) } misses the right subtree.
  3. Final Answer:

    node switch { null => 0, TreeNode(var v, var l, var r) => v + Sum(l) + Sum(r) } -> Option D
  4. Quick Check:

    Correct pattern with all parts and base case first [OK]
Hint: Include all node parts and base case null first [OK]
Common Mistakes:
  • Omitting 'var' in pattern variables
  • Missing one subtree in sum
  • Placing null case after non-null without care
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard