Introduction
A recursive function is a function that calls itself in order to solve a problem. Recursion is a powerful technique for solving problems that can be broken down into smaller, similar subproblems. This chapter will cover the syntax and usage of recursive functions in Kotlin, along with examples of common recursive problems.
Basic Recursive Function
A basic recursive function in Kotlin calls itself with modified arguments until a base condition is met. The base condition is necessary to stop the recursion and prevent infinite loops.
Syntax
fun functionName(parameters): ReturnType {
if (baseCondition) {
return baseValue
} else {
return functionName(modifiedParameters)
}
}
Example
fun main() {
val result = factorial(5)
println("Factorial: $result")
}
fun factorial(n: Int): Int {
return if (n == 1) {
1
} else {
n * factorial(n - 1)
}
}
Explanation:
fun factorial(n: Int): Int { ... }: Declares a recursive function namedfactorialthat calculates the factorial of a number.if (n == 1) { 1 } else { n * factorial(n - 1) }: Checks ifnis 1 (base condition). If true, returns 1; otherwise, returnsnmultiplied by the factorial ofn - 1.
Output:
Factorial: 120
Tail-Recursive Function
A tail-recursive function is a special form of recursion where the recursive call is the last operation in the function. Tail recursion can be optimized by the compiler to avoid stack overflow errors for deep recursion.
Syntax
tailrec fun functionName(parameters): ReturnType {
if (baseCondition) {
return baseValue
} else {
return functionName(modifiedParameters)
}
}
Example
fun main() {
val result = factorial(5)
println("Factorial: $result")
}
tailrec fun factorial(n: Int, accumulator: Int = 1): Int {
return if (n == 1) {
accumulator
} else {
factorial(n - 1, n * accumulator)
}
}
Explanation:
tailrec fun factorial(n: Int, accumulator: Int = 1): Int { ... }: Declares a tail-recursive function namedfactorialthat calculates the factorial of a number using an accumulator.if (n == 1) { accumulator } else { factorial(n - 1, n * accumulator) }: Checks ifnis 1 (base condition). If true, returns the accumulator; otherwise, callsfactorialwithn - 1andn * accumulator.
Output:
Factorial: 120
Common Recursive Problems
Fibonacci Sequence
The Fibonacci sequence is a series of numbers where each number is the sum of the two preceding ones. The sequence starts with 0 and 1.
Example
fun main() {
val n = 10
for (i in 0 until n) {
print("${fibonacci(i)} ")
}
}
fun fibonacci(n: Int): Int {
return if (n == 0 || n == 1) {
n
} else {
fibonacci(n - 1) + fibonacci(n - 2)
}
}
Explanation:
fun fibonacci(n: Int): Int { ... }: Declares a recursive function namedfibonaccithat calculates the nth Fibonacci number.if (n == 0 || n == 1) { n } else { fibonacci(n - 1) + fibonacci(n - 2) }: Checks ifnis 0 or 1 (base condition). If true, returnsn; otherwise, returns the sum offibonacci(n - 1)andfibonacci(n - 2).
Output:
0 1 1 2 3 5 8 13 21 34
Sum of Natural Numbers
The sum of the first n natural numbers can be calculated using recursion.
Example
fun main() {
val result = sumOfNaturalNumbers(10)
println("Sum of natural numbers: $result")
}
fun sumOfNaturalNumbers(n: Int): Int {
return if (n <= 1) {
n
} else {
n + sumOfNaturalNumbers(n - 1)
}
}
Explanation:
fun sumOfNaturalNumbers(n: Int): Int { ... }: Declares a recursive function namedsumOfNaturalNumbersthat calculates the sum of the firstnnatural numbers.if (n <= 1) { n } else { n + sumOfNaturalNumbers(n - 1) }: Checks ifnis less than or equal to 1 (base condition). If true, returnsn; otherwise, returnsnplus the sum of natural numbers up ton - 1.
Output:
Sum of natural numbers: 55
Example Program with Recursive Functions
Here is an example program that demonstrates the use of various recursive functions in Kotlin:
fun main() {
// Factorial
val factorialResult = factorial(5)
println("Factorial: $factorialResult")
// Tail-recursive factorial
val tailFactorialResult = tailFactorial(5)
println("Tail-recursive factorial: $tailFactorialResult")
// Fibonacci sequence
val n = 10
print("Fibonacci sequence: ")
for (i in 0 until n) {
print("${fibonacci(i)} ")
}
println()
// Sum of natural numbers
val sumResult = sumOfNaturalNumbers(10)
println("Sum of natural numbers: $sumResult")
}
fun factorial(n: Int): Int {
return if (n == 1) {
1
} else {
n * factorial(n - 1)
}
}
tailrec fun tailFactorial(n: Int, accumulator: Int = 1): Int {
return if (n == 1) {
accumulator
} else {
tailFactorial(n - 1, n * accumulator)
}
}
fun fibonacci(n: Int): Int {
return if (n == 0 || n == 1) {
n
} else {
fibonacci(n - 1) + fibonacci(n - 2)
}
}
fun sumOfNaturalNumbers(n: Int): Int {
return if (n <= 1) {
n
} else {
n + sumOfNaturalNumbers(n - 1)
}
}
Output:
Factorial: 120
Tail-recursive factorial: 120
Fibonacci sequence: 0 1 1 2 3 5 8 13 21 34
Sum of natural numbers: 55
Conclusion
In this chapter, you learned about recursive functions in Kotlin, including their syntax and usage for solving problems that can be broken down into smaller subproblems. You also explored tail-recursive functions and saw examples of common recursive problems such as the factorial, Fibonacci sequence, and sum of natural numbers. Understanding how to use recursive functions is essential for solving complex problems in a concise and elegant manner.