📖 Scenario: Imagine you have a set of unique numbers and you want to find every possible way to arrange them. This is useful in games, puzzles, and planning tasks where order matters.
🎯 Goal: You will build a Rust program that takes an array of numbers and generates all possible permutations of that array.
📋 What You'll Learn
Create an array with exact values [1, 2, 3]
Create a mutable vector to store permutations
Write a recursive function to generate permutations
Print all generated permutations
💡 Why This Matters
🌍 Real World
Generating permutations is useful in solving puzzles, arranging schedules, and exploring all possible options in games or decision-making.
💼 Career
Understanding recursion and permutations helps in algorithm design, coding interviews, and solving complex problems in software development.
Progress0 / 4 steps
1
Create the initial array
Create an array called nums with the exact values [1, 2, 3].
DSA Rust
Hint
Use let nums = [1, 2, 3]; to create the array.
2
Create a vector to store permutations
Create a mutable vector called result to store vectors of i32 that will hold all permutations.
DSA Rust
Hint
Use let mut result: Vec> = Vec::new(); to create an empty vector of vectors.
3
Write the recursive function to generate permutations
Write a recursive function called permute that takes three parameters: a vector current of i32, a slice remaining of i32, and a mutable reference to result. The function should generate all permutations by adding elements from remaining to current and store complete permutations in result.
DSA Rust
Hint
Use recursion to build permutations by moving elements from remaining to current. When remaining is empty, add current to result.
4
Call the function and print all permutations
Call the permute function with an empty vector for current, the nums array as remaining, and a mutable reference to result. Then print each permutation in result on its own line.
DSA Rust
Hint
Call permute(Vec::new(), &nums, &mut result); then print each permutation with println!("{:?}", perm);.
Practice
(1/5)
1. What does the process of generating all permutations of an array mean?
easy
A. Listing all possible orders of the array elements
B. Sorting the array in ascending order
C. Removing duplicate elements from the array
D. Finding the maximum element in the array
Solution
Step 1: Understand permutations
Permutations are all possible ways to arrange elements in order.
Step 2: Apply to array elements
Generating all permutations means listing every possible order of the array elements.
Final Answer:
Listing all possible orders of the array elements -> Option A
Quick Check:
Permutations = all orders [OK]
Hint: Permutations = all possible orders of elements [OK]
Common Mistakes:
Confusing permutations with sorting
Thinking permutations remove duplicates
Assuming permutations find max element
2. Which Rust code snippet correctly starts generating permutations of a vector vec![1, 2, 3] using recursion?
easy
A. fn permute(arr: &mut Vec<i32>, start: usize) { if start == arr.len() { println!("{:?}", arr); } else { for i in start..arr.len() { arr.swap(start, i); permute(arr, start + 1); arr.swap(start, i); } } }
B. fn permute(arr: Vec<i32>) { for i in 0..arr.len() { println!("{:?}", arr[i]); } }
C. fn permute(arr: &Vec<i32>) { println!("{:?}", arr); }
D. fn permute(arr: &mut Vec<i32>) { arr.sort(); println!("{:?}", arr); }
Solution
Step 1: Identify recursive permutation logic
fn permute(arr: &mut Vec<i32>, start: usize) { if start == arr.len() { println!("{:?}", arr); } else { for i in start..arr.len() { arr.swap(start, i); permute(arr, start + 1); arr.swap(start, i); } } } uses recursion with swapping and backtracking to generate permutations.
Step 2: Check other options
Options B, C, and D do not generate permutations; they only print or sort.
Final Answer:
fn permute(arr: &mut Vec<i32>, start: usize) { if start == arr.len() { println!("{:?}", arr); } else { for i in start..arr.len() { arr.swap(start, i); permute(arr, start + 1); arr.swap(start, i); } } } -> Option A
Quick Check:
Recursive swap + backtrack = fn permute(arr: &mut Vec<i32>, start: usize) { if start == arr.len() { println!("{:?}", arr); } else { for i in start..arr.len() { arr.swap(start, i); permute(arr, start + 1); arr.swap(start, i); } } } [OK]
Hint: Look for recursion with swap and backtrack [OK]
Common Mistakes:
Not using mutable reference for swapping
Missing recursive call
Printing elements instead of permutations
3. What is the output of this Rust code snippet?
fn permute(arr: &mut Vec<i32>, start: usize) {
if start == arr.len() {
println!("{:?}", arr);
} else {
for i in start..arr.len() {
arr.swap(start, i);
permute(arr, start + 1);
arr.swap(start, i);
}
}
}
fn main() {
let mut v = vec![1, 2];
permute(&mut v, 0);
}
medium
A. [1, 2]
B. [1, 2]
[2, 1]
C. [2, 1]
D. Compilation error
Solution
Step 1: Trace recursive calls for vec![1, 2]
Start at index 0, swap with 0 and 1:
- Swap(0,0): [1,2], print when start=2
- Swap(0,1): [2,1], print when start=2
Step 2: Confirm output lines
Both permutations [1, 2] and [2, 1] are printed in order.
Final Answer:
[1, 2]
[2, 1] -> Option B
Quick Check:
All permutations of [1,2] printed [OK]
Hint: Small array permutations = factorial length outputs [OK]
Common Mistakes:
Expecting only one permutation output
Confusing swap order
Assuming compilation error
4. Identify the bug in this Rust code for generating permutations and select the fix:
fn permute(arr: Vec<i32>, start: usize) {
if start == arr.len() {
println!("{:?}", arr);
} else {
for i in start..arr.len() {
let mut arr = arr.clone();
arr.swap(start, i);
permute(arr, start + 1);
}
}
}
fn main() {
let v = vec![1, 2, 3];
permute(v, 0);
}
medium
A. No bug, code works fine
B. Add mut keyword to v in main
C. Replace arr.swap with arr.reverse
D. Change parameter to mutable reference: arr: &mut Vec<i32> and remove cloning
Solution
Step 1: Analyze cloning and mutation
Cloning arr each loop causes performance issues and unnecessary copies.
Step 2: Fix by using mutable reference
Passing &mut Vec<i32> allows swapping in place and backtracking without cloning.
Final Answer:
Change parameter to mutable reference: arr: &mut Vec<i32> and remove cloning -> Option D
Quick Check:
Use mutable reference to avoid cloning [OK]
Hint: Use &mut Vec to swap without cloning [OK]
Common Mistakes:
Cloning inside loop causes inefficiency
Not using mutable reference for swaps
Thinking adding mut to main vector fixes logic
5. Given a vector vec![1, 2, 2], how many unique permutations will the standard recursive swap method print without filtering duplicates?
hard
A. 2
B. 3
C. 6
D. 1
Solution
Step 1: Calculate total permutations without filtering
For 3 elements, total permutations = 3! = 6.
Step 2: Consider duplicates in array
Standard recursive swap method does not filter duplicates, so all 6 permutations including duplicates print.
Final Answer:
6 -> Option C
Quick Check:
3! = 6 permutations printed [OK]
Hint: Without filtering, duplicates cause factorial count [OK]
Common Mistakes:
Assuming duplicates reduce output automatically
Confusing unique permutations with total permutations
Thinking output is 3 or 2 without filtering
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.