Bird
Raised Fist0
Kotlinprogramming~5 mins

Returning functions from functions in Kotlin - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Returning functions from functions
O(n)
Understanding Time Complexity

When a function returns another function, we want to know how the time it takes grows as inputs change.

We ask: How does calling the returned function affect overall work done?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


fun multiplier(factor: Int): (Int) -> Int {
    return { number: Int -> number * factor }
}

fun main() {
    val timesTwo = multiplier(2)
    println(timesTwo(10))
}
    

This code returns a function that multiplies a number by a given factor.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Multiplying two numbers inside the returned function.
  • How many times: Each time the returned function is called, once per call.
How Execution Grows With Input

The multiplication inside the returned function takes the same time no matter the input size.

Number of Calls (n)Approx. Operations
1010 multiplications
100100 multiplications
10001000 multiplications

Pattern observation: The work grows linearly with how many times you call the returned function.

Final Time Complexity

Time Complexity: O(n)

This means the total time grows directly with the number of times you call the returned function.

Common Mistake

[X] Wrong: "Returning a function means the original function does a lot of work upfront."

[OK] Correct: The original function just creates and returns a small function quickly; the real work happens when you call the returned function.

Interview Connect

Understanding how returned functions work helps you explain how code runs step-by-step, a skill useful in many coding challenges.

Self-Check

"What if the returned function did a loop inside it? How would the time complexity change?"

Practice

(1/5)
1. What does it mean when a Kotlin function returns another function?
easy
A. The function can only return primitive data types like Int or String.
B. The function cannot have parameters if it returns another function.
C. The outer function produces a function as its result that can be called later.
D. The returned function must be called immediately inside the outer function.

Solution

  1. Step 1: Understand function return types

    In Kotlin, a function can return any type, including another function type.
  2. Step 2: Interpret returning a function

    Returning a function means the outer function gives back a function that can be stored or called later.
  3. Final Answer:

    The outer function produces a function as its result that can be called later. -> Option C
  4. Quick Check:

    Returning a function means output is a callable function [OK]
Hint: Returning function means output is a callable function [OK]
Common Mistakes:
  • Thinking only primitive types can be returned
  • Assuming returned function must be called immediately
  • Believing returned functions cannot have parameters
2. Which of the following is the correct syntax to declare a Kotlin function that returns another function taking an Int and returning a String?
easy
A. fun outer(): (Int) -> String = { i -> i.toString }
B. fun outer(): (Int) -> String { return { i -> i.toString() } }
C. fun outer(): (Int) String { return { i -> i.toString() } }
D. fun outer(): Int -> String = return { i -> i.toString() } }

Solution

  1. Step 1: Check function return type syntax

    In Kotlin, a function returning another function uses syntax like: fun name(): (ParamType) -> ReturnType
  2. Step 2: Verify the return statement

    The function returns a lambda matching (Int) -> String, e.g., { i -> i.toString() }
  3. Final Answer:

    fun outer(): (Int) -> String { return { i -> i.toString() } } -> Option B
  4. Quick Check:

    Correct function type syntax = fun outer(): (Int) -> String { return { i -> i.toString() } } [OK]
Hint: Return type for function is (ParamType) -> ReturnType [OK]
Common Mistakes:
  • Using arrow -> incorrectly in return type
  • Mixing return type syntax with function body
  • Omitting parentheses around function type
3. What is the output of this Kotlin code?
fun makeMultiplier(x: Int): (Int) -> Int {
    return { y -> x * y }
}

fun main() {
    val multiplyBy3 = makeMultiplier(3)
    println(multiplyBy3(5))
}
medium
A. 35
B. 8
C. Compilation error
D. 15

Solution

  1. Step 1: Understand makeMultiplier function

    makeMultiplier returns a function that multiplies its input by x (captured from outer function).
  2. Step 2: Trace main function calls

    multiplyBy3 is a function multiplying by 3; multiplyBy3(5) = 3 * 5 = 15.
  3. Final Answer:

    15 -> Option D
  4. Quick Check:

    3 * 5 = 15 [OK]
Hint: Returned function uses captured outer variable [OK]
Common Mistakes:
  • Confusing parameter names
  • Forgetting the closure captures x
  • Expecting immediate multiplication without calling returned function
4. Identify the error in this Kotlin code that tries to return a function:
fun outer(): (Int) -> Int {
    val inner = { x: Int -> x * 2 }
    return inner()
}
medium
A. Calling inner() instead of returning the function itself
B. Missing return type declaration for outer function
C. Incorrect lambda parameter syntax
D. Cannot return a lambda from a function

Solution

  1. Step 1: Analyze return statement

    inner is a lambda function; inner() calls it and returns Int, not a function.
  2. Step 2: Correct return value

    To return the function itself, return inner without parentheses.
  3. Final Answer:

    Calling inner() instead of returning the function itself -> Option A
  4. Quick Check:

    Return function, not function call [OK]
Hint: Return function name without () to return function itself [OK]
Common Mistakes:
  • Returning function call instead of function
  • Omitting function return type
  • Misunderstanding lambda syntax
5. Given this Kotlin code, what will be the output?
fun createCounter(start: Int): () -> Int {
    var count = start
    return {
        count += 1
        count
    }
}

fun main() {
    val counter = createCounter(10)
    println(counter())
    println(counter())
}
hard
A. 11 12
B. 10 11
C. 12 13
D. Compilation error

Solution

  1. Step 1: Understand closure capturing variable

    The returned lambda captures 'count' variable and increments it each call.
  2. Step 2: Trace calls to counter()

    First call: count = 10 + 1 = 11; prints 11. Second call: count = 11 + 1 = 12; prints 12.
  3. Final Answer:

    11 12 -> Option A
  4. Quick Check:

    Closure increments count on each call [OK]
Hint: Closures keep state between calls [OK]
Common Mistakes:
  • Assuming count resets each call
  • Confusing initial value with first output
  • Expecting compilation error due to var usage
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