Гид по технологиям

Сумма первых n натуральных чисел рекурсией

3 min read Алгоритмы Обновлено 16 Dec 2025
Сумма первых n чисел — рекурсивный подход
Сумма первых n чисел — рекурсивный подход

Мужчина за компьютером и логотипы языков программирования C, C++, Python, Java и JavaScript

Задача

Дано натуральное число n. Требуется найти сумму первых n натуральных чисел с помощью рекурсивной функции.

Примеры:

  • n = 5 → 1 + 2 + 3 + 4 + 5 = 15
  • n = 7 → 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28
  • n = 6 → 1 + 2 + 3 + 4 + 5 + 6 = 21

Идея рекурсии (коротко)

Рекурсия — это когда функция вызывает саму себя. В рекурсивном алгоритме обязательно есть базовый случай (останавливает рекурсию) и шаг рекурсии (уменьшает задачу). Здесь базовый случай — n <= 1, шаг рекурсии — добавить n к сумме первых n-1 чисел.

Краткая формулировка:

  • Базовый случай: если n <= 1, вернуть n.
  • Рекурсивный шаг: вернуть n + findSum(n - 1).

Псевдокод

findSum(n):
    if n <= 1 then
        return n
    else
        return n + findSum(n - 1)

Альтернативы (быстро)

  • Формула: n * (n + 1) / 2 — O(1) по времени и памяти.
  • Итеративный цикл: суммировать от 1 до n — O(n) по времени, O(1) по памяти.
  • Хвостовая рекурсия с аккумулятором — может быть оптимизирована компилятором/интерпретатором в некоторых языках.

Важно: для больших n рекурсия может привести к переполнению стека. Формула безопаснее и быстрее.

Сложность

  • Время: O(n) для рекурсивного и итеративного решений.
  • Память: O(n) из-за глубины рекурсии (стек вызовов). Формула — O(1).

Примеры реализации

Ниже приведены реализации, соответствующие псевдокоду. Комментарии и форматирование улучшены для чтения.

C++

// C++ implementation to find the sum of
// first n natural numbers using recursion
#include 
using namespace std;

// Recursive function to find the sum of first n natural numbers
int findSum(int n)
{
    if (n <= 1)
    {
        return n;
    }
    else
    {
        return n + findSum(n - 1);
    }
}

// Driver code
int main()
{
    int n1 = 5, n2 = 7, n3 = 6;

    cout << "n1: " << n1 << endl;
    cout << "n2: " << n2 << endl;
    cout << "n3: " << n3 << endl;

    cout << "Sum of first " << n1 << " natural numbers: " << findSum(n1) << endl;
    cout << "Sum of first " << n2 << " natural numbers: " << findSum(n2) << endl;
    cout << "Sum of first " << n3 << " natural numbers: " << findSum(n3) << endl;

    return 0;
}

Вывод программы:

n1: 5
n2: 7
n3: 6
Sum of first 5 natural numbers: 15
Sum of first 7 natural numbers: 28
Sum of first 6 natural numbers: 21

Python

# Python implementation to find the sum of
# first n natural numbers using recursion

# Recursive function to find the sum of first n natural numbers
def findSum(n):
    if n <= 1:
        return n
    else:
        return n + findSum(n - 1)

# Driver Code
n1 = 5
n2 = 7
n3 = 6

print("n1:", n1)
print("n2:", n2)
print("n3:", n3)

print("Sum of first", n1, "natural numbers:", findSum(n1))
print("Sum of first", n2, "natural numbers:", findSum(n2))
print("Sum of first", n3, "natural numbers:", findSum(n3))

Вывод:

n1: 5
n2: 7
n3: 6
Sum of first 5 natural numbers: 15
Sum of first 7 natural numbers: 28
Sum of first 6 natural numbers: 21

C

// C implementation to find the sum of
// first n natural numbers using recursion
#include 

// Recursive function to find the sum of first n natural numbers
int findSum(int n)
{
    if (n <= 1)
    {
        return n;
    }
    else
    {
        return n + findSum(n - 1);
    }
}

// Driver code
int main()
{
    int n1 = 5, n2 = 7, n3 = 6;

    printf("n1: %d\n", n1);
    printf("n2: %d\n", n2);
    printf("n3: %d\n", n3);

    printf("Sum of first %d natural numbers: %d\n", n1, findSum(n1));
    printf("Sum of first %d natural numbers: %d\n", n2, findSum(n2));
    printf("Sum of first %d natural numbers: %d\n", n3, findSum(n3));

    return 0;
}

Вывод тот же, что и в других примерах.

JavaScript

// JavaScript implementation to find the sum of
// first n natural numbers using recursion

// Recursive function to find the sum of first n natural numbers
function findSum(n) {
    if (n <= 1) {
        return n;
    } else {
        return n + findSum(n - 1);
    }
}

// Driver Code
var n1 = 5, n2 = 7, n3 = 6;

console.log("n1:", n1);
console.log("n2:", n2);
console.log("n3:", n3);

console.log("Sum of first", n1, "natural numbers:", findSum(n1));
console.log("Sum of first", n2, "natural numbers:", findSum(n2));
console.log("Sum of first", n3, "natural numbers:", findSum(n3));

В браузере можно использовать document.write, но для отладки удобнее console.log.

Java

// Java implementation to find the sum of
// first n natural numbers using recursion
public class Main {
    // Recursive function to find the sum of first n natural numbers
    public static int findSum(int n) {
        if (n <= 1) {
            return n;
        } else {
            return n + findSum(n - 1);
        }
    }

    // Driver code
    public static void main(String[] args) {
        int n1 = 5, n2 = 7, n3 = 6;
        System.out.println("n1: " + n1);
        System.out.println("n2: " + n2);
        System.out.println("n3: " + n3);

        System.out.println("Sum of first " + n1 + " natural numbers: " + findSum(n1));
        System.out.println("Sum of first " + n2 + " natural numbers: " + findSum(n2));
        System.out.println("Sum of first " + n3 + " natural numbers: " + findSum(n3));
    }
}

Когда рекурсия не подходит

  • Большие n: глубина рекурсии может превысить лимит стека и привести к ошибке.
  • Требуется максимально быстрое решение: формула n*(n+1)/2 быстрее и экономичнее.
  • Среда без оптимизации хвостовой рекурсии: хвостовая реализация может не дать преимуществ.

Важно: для задач, где n может быть миллионами, используйте формулу или итерацию.

Набор тестов и критерии приёмки

Тесты (вход → ожидаемый результат):

  • 0 → 0
  • 1 → 1
  • 5 → 15
  • 10 → 55
  • отрицательное n (по соглашению) → либо 0, либо ошибка — нужно определить поведение заранее

Критерии приёмки:

  • Функция корректно обрабатывает n >= 0.
  • Для n в пределах целесообразной глубины стека программа возвращает правильный результат.
  • Для больших n документация указывает альтернативный метод (формула).

Практические подсказки и эвристики

  • Всегда реализуйте базовый случай первым; это предотвращает бесконечную рекурсию.
  • Тестируйте на граничных значениях: 0, 1 и максимально допустимом n.
  • Если язык поддерживает оптимизацию хвостовой рекурсии, используйте аккумулятор.
  • Для алгоритмических интервью уместно показать и рекурсивное, и формульное решение.

Краткая терминология

  • Рекурсия — метод, когда функция вызывает саму себя.
  • Базовый случай — условие, при достижении которого рекурсия останавливается.
  • Глубина рекурсии — количество вложенных вызовов; влияет на потребление стека.

Итог

Рекурсивное решение для суммы первых n натуральных чисел просто и наглядо: findSum(n) = n + findSum(n-1) с базовым случаем n <= 1. Однако для практических задач предпочтительнее формула n*(n+1)/2 из-за фиксированной сложности и отсутствия риска переполнения стека.

Важно: выбирайте метод в зависимости от требований по производительности и пределов входных данных.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Уменьшить размер PDF онлайн — лучшие инструменты
PDF

Уменьшить размер PDF онлайн — лучшие инструменты

Проверить скорость Wi‑Fi на Mac
Инструкции

Проверить скорость Wi‑Fi на Mac

Меню Power User в Windows 10
Windows

Меню Power User в Windows 10

3D-рендеры Minecraft с Chunky
Minecraft

3D-рендеры Minecraft с Chunky

Как отправлять письма в Outlook 2013
Руководство

Как отправлять письма в Outlook 2013

Что делать, если ПК случайно перезагружается
Windows

Что делать, если ПК случайно перезагружается