Использование рекурсии для суммирования чисел - PullRequest
13 голосов
/ 24 апреля 2009

Я только что изучал концепцию рекурсии и подумал, что попробую простой пример. В следующем коде я пытаюсь взять числа: 1, 2, 3, 4, 5 и сложить их вместе, используя рекурсию. Я ожидал, что результат будет 15, но мой код возвращает 16.

Что я делаю не так?

Код:

    static void Main(string[] args)
    {

        Console.WriteLine(Sum(5));
        Console.Read();
    }


    static int Sum(int value)
    {
        if (value > 0)
        {
          return value + Sum(value - 1);
        }
        else
        {
            return 1;
        }
    }

Ответы [ 15 ]

0 голосов
/ 07 января 2018

Попробуйте этот код:

def sumr(n): 
    if n==0:
        return n
    return n+sumr(n-1)
0 голосов
/ 24 ноября 2016

Чтобы начать с конца, рекурсивный метод Sum выглядит следующим образом:

    // version 3

    public static int Sum(int startRange, int endRange)
    {
        if (endRange > startRange)
        {
            return endRange + Sum(startRange, endRange - 1);

        }

        if (endRange < startRange)
        {
            return startRange + Sum(endRange, startRange - 1);

        }

        return endRange; 

    }

Жесткое кодирование startRange равным 0 дает нам:

    // version 2

    public static int Sum(int range)
    {
        if (range > 0)
        {
            return range + Sum(0, range - 1);

        }

        if (range < 0)
        {
            return Sum(range, -1);

        }

        return range;

    }

... и если вы хотите ограничить метод только положительными числами, знак не нужен:

    // version 1

    public static unsigned int Sum(unsigned int range)
    {
        if (range > 0)
        {
            return range + Sum(0, range - 1);

        }

        return range;

    }

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

0 голосов
/ 30 июля 2016

На самом деле, я думаю, вам не нужно проверять случай, потому что

public static int sum(int number){
    if(number > 0){
       return number + sum(--number);
    }
    return number; // return 0 so that's why you don't need check else condition
}
0 голосов
/ 21 ноября 2015

Также можно написать так:

public static int sum(int n){
    int total;

    if(n==1){
        total =1;

    }else{
        total = sum(n-1)+n;
    }
    return total;
}
0 голосов
/ 26 августа 2013
using System;
using NUnit.Framework;

namespace Recursion
{
  [TestFixture()]
    public class Test
    {
        [Test()]
        public void TestSum ()
        {
            Assert.AreEqual (Sum (new int[] { }), 0);
            Assert.AreEqual (Sum (new int[] { 0 }), 0);
            Assert.AreEqual (Sum (new int[] { 1 }), 1);
            Assert.AreEqual (Sum (new int[] { 1, 2, 3, 4, 5 }), 15);
        }

        public int Sum(int[] head)
        {
            if (head.Length == 0) return 0;

            int[] tail = new int[head.Length - 1];

            for (int i = 1; i < head.Length; i++) 
            {
                tail [i-1] = head [i];
            }

            return head[0] + Sum (tail);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...