Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Collections.Generic;
- // Интерфейс стратегии вычисления
- public interface ICalculationStrategy
- {
- int Calculate(int prev1, int prev2);
- }
- // Конкретная стратегия вычисления квадрата разности
- public class SquareDifferenceStrategy : ICalculationStrategy
- {
- public int Calculate(int prev1, int prev2)
- {
- return (prev1 - prev2) * (prev1 - prev2);
- }
- }
- // Основной класс последовательности с внутренним итератором
- public class Sequence : IEnumerable<int>
- {
- private readonly int _x0;
- private readonly int _x1;
- private readonly int _n;
- private readonly ICalculationStrategy _strategy;
- public Sequence(int x0, int x1, int n, ICalculationStrategy strategy)
- {
- _x0 = x0;
- _x1 = x1;
- _n = n;
- _strategy = strategy;
- }
- // Внутренний итератор с использованием yield return
- public IEnumerator<int> GetEnumerator()
- {
- if (_n <= 0) yield break;
- // Возвращаем первый элемент
- yield return _x0;
- if (_n == 1) yield break;
- // Возвращаем второй элемент
- yield return _x1;
- if (_n == 2) yield break;
- int prev2 = _x0;
- int prev1 = _x1;
- // Генерируем остальные элементы последовательности
- for (int i = 2; i < _n; i++)
- {
- int current = _strategy.Calculate(prev1, prev2);
- yield return current;
- prev2 = prev1;
- prev1 = current;
- }
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
- }
- // Дополнительная стратегия суммирования
- public class SumStrategy : ICalculationStrategy
- {
- public int Calculate(int prev1, int prev2)
- {
- return prev1 + prev2;
- }
- }
- class Program
- {
- static void Main()
- {
- // Тест базовой последовательности
- Console.WriteLine("Original sequence:");
- var sequence = new Sequence(0, 2, 10, new SquareDifferenceStrategy());
- foreach (var number in sequence)
- {
- Console.Write($"{number} ");
- }
- Console.WriteLine();
- // Демонстрация работы с другой стратегией (числа Фибоначчи)
- Console.WriteLine("\nFibonacci sequence:");
- var fibonacciSequence = new Sequence(0, 1, 10, new SumStrategy());
- foreach (var number in fibonacciSequence)
- {
- Console.Write($"{number} ");
- }
- Console.WriteLine();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement