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 namedfactorial
that calculates the factorial of a number.if (n == 1) { 1 } else { n * factorial(n - 1) }
: Checks ifn
is 1 (base condition). If true, returns 1; otherwise, returnsn
multiplied 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 namedfactorial
that calculates the factorial of a number using an accumulator.if (n == 1) { accumulator } else { factorial(n - 1, n * accumulator) }
: Checks ifn
is 1 (base condition). If true, returns the accumulator; otherwise, callsfactorial
withn - 1
andn * 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 namedfibonacci
that calculates the nth Fibonacci number.if (n == 0 || n == 1) { n } else { fibonacci(n - 1) + fibonacci(n - 2) }
: Checks ifn
is 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 namedsumOfNaturalNumbers
that calculates the sum of the firstn
natural numbers.if (n <= 1) { n } else { n + sumOfNaturalNumbers(n - 1) }
: Checks ifn
is less than or equal to 1 (base condition). If true, returnsn
; otherwise, returnsn
plus 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.