Go Recursion
What is Recursion?
Recursion is a programming technique where a function calls itself to solve smaller instances of a problem. It continues until a base condition is met, preventing infinite loops. Recursion is useful for problems like factorial computation, Fibonacci sequence generation, and tree traversal.
Syntax of Recursion in Go
A recursive function in Go consists of:
- A terminating condition that prevents additional recursive calls.
- A recursive scenario in which the function invokes itself with adjusted parameters.
package main import "fmt" // Recursive function example func recursiveFunction(n int) { if n <= 0 { // Base case fmt.Println("Recursion ends here") return } fmt.Println("Current value:", n) recursiveFunction(n - 1) // Recursive call with decremented value } func main() { recursiveFunction(5) }
Output:
Current value: 5 Current value: 4 Current value: 3 Current value: 2 Current value: 1 Recursion ends here
Example 1: Factorial using Recursion
Factorial of a number nnn is defined as:
n!=n×(n−1)×(n−2)×...×1
package main import "fmt" // Function to compute factorial recursively func factorial(n int) int { if n == 0 { return 1 // Base case: 0! is 1 } return n * factorial(n-1) // Recursive case } func main() { num := 5 fmt.Printf("Factorial of %d is %d\n", num, factorial(num)) }
Output:
Factorial of 5 is 120
Example 2: Fibonacci Sequence with Recursion
The Fibonacci sequence follows the rule:
F(n)=F(n−1)+F(n−2)F(n) = F(n-1) + F(n-2)F(n)=F(n−1)+F(n−2)
where F(0)=0F(0) = 0F(0)=0 and F(1)=1F(1) = 1F(1)=1.
package main import "fmt" // Recursive function to calculate Fibonacci numbers func fibonacci(n int) int { if n <= 1 { return n // Base cases: F(0) = 0, F(1) = 1 } return fibonacci(n-1) + fibonacci(n-2) // Recursive case } func main() { num := 6 fmt.Printf("Fibonacci number at position %d is %d\n", num, fibonacci(num)) }
Output:
Fibonacci number at position 6 is 8
Example 3: Sum of Digits using Recursion
A function that recursively calculates the sum of digits of a number.
package main import "fmt" // Function to compute sum of digits func sumOfDigits(n int) int { if n == 0 { return 0 // Base case: if no digits left } return (n % 10) + sumOfDigits(n/10) // Recursive case } func main() { num := 1234 fmt.Printf("Sum of digits of %d is %d\n", num, sumOfDigits(num)) }
Output:
Sum of digits of 1234 is 10
Example 4: Reverse a String Recursively
A function that reverses a string using recursion.
package main import "fmt" // Recursive function to reverse a string func reverseString(s string) string { if len(s) == 0 { return "" // Base case: empty string } return string(s[len(s)-1]) + reverseString(s[:len(s)-1]) // Recursive case } func main() { str := "hello" fmt.Printf("Reversed string: %s\n", reverseString(str)) }
Output:
Reversed string: olleh
Key Points to Remember About Recursion in Go
- 1. Every recursion must have a base condition to prevent infinite loops.
- 2. Recursive calls consume stack memory, so excessive recursion may cause a stack overflow.
- 3. Tail recursion is not optimized by Go's compiler, so deep recursion should be avoided in performance-critical applications.
- 4. Recursion can be replaced with iteration in some cases for better efficiency.