Ленивая оценка: методы и примеры кода для эффективных вычислений

Отложенное вычисление — это концепция программирования, которая откладывает вычисление выражения до тех пор, пока его значение действительно не понадобится. Этот подход может обеспечить повышение производительности за счет исключения ненужных вычислений. Вот несколько методов реализации ленивых вычислений с примерами кода:

  1. Генераторы в Python:

    def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
    fib_sequence = fibonacci()
    print(next(fib_sequence))  # 0
    print(next(fib_sequence))  # 1
    print(next(fib_sequence))  # 1
  2. Потоки в Java:

    import java.util.stream.Stream;
    public class LazyEvaluationDemo {
    public static void main(String[] args) {
        Stream<Integer> numbers = Stream.iterate(0, n -> n + 1);
        numbers.limit(5).forEach(System.out::println);  // 0 1 2 3 4
    }
    }
  3. Мемоизация в JavaScript:

    function memoize(func) {
    const cache = {};
    return (...args) => {
        const key = JSON.stringify(args);
        if (cache[key] === undefined) {
            cache[key] = func(...args);
        }
        return cache[key];
    };
    }
    const expensiveComputation = memoize((x, y) => {
    console.log('Performing expensive computation...');
    return x + y;
    });
    console.log(expensiveComputation(2, 3));  // Performing expensive computation... 5
    console.log(expensiveComputation(2, 3));  // 5 (cached result)
  4. Обещания в JavaScript (с использованием Promise.lazy):

    function lazyEvaluation() {
    return Promise.lazy(() => {
        console.log('Performing lazy evaluation...');
        return 42;
    });
    }
    lazyEvaluation().then(result => {
    console.log(result);  // Performing lazy evaluation... 42
    });
    lazyEvaluation().then(result => {
    console.log(result);  // 42 (cached result)
    });
  5. Последовательности Kotlin:

    fun fibonacciSequence(): Sequence<Int> = sequence {
    var a = 0
    var b = 1
    while (true) {
        yield(a)
        val temp = a + b
        a = b
        b = temp
    }
    }
    val fibSequence = fibonacciSequence()
    println(fibSequence.take(5).toList())  // [0, 1, 1, 2, 3]