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

Теперь, когда я использую рекурсию для вычисления суммы чисел, я хочу сделать что-то немного другое. Ниже приведен мой код, который будет суммировать числа 1,2,3,4,5. Как бы я изменил свой код, чтобы поместить числа 1, 2, 3, 4, 5 в массив и затем использовать его в методе рекурсии? Я пробовал так много разных попыток, и я, очевидно, что-то упустил. Я знаю, что в методе рекурсии я хочу использовать свойство Length массива для управления им.

Susan

   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 0;
        }
    }

Ответы [ 8 ]

5 голосов
/ 24 апреля 2009
let seq = [1;2;3;4;5]

let rec samp nums = 
  match nums with
  | []      -> 0
  | h::t    -> h + samp t
3 голосов
/ 21 июня 2013
static int Sum(int[] a, int index = 0)
{
    if (a[index] == a[a.Length - 1])
    {
        return a[a.Length - 1];
    }
    return a[index] + Sum(a, index + 1);
}

static void Main()
{
    int[] arr = {1, 2, 3, 9, 15};
    Console.WriteLine(Sum(arr));
}

Я тоже новичок, но это мое решение, и оно работает для меня.

3 голосов
/ 24 апреля 2009

Как насчет использования Stack ?:

Stack<int> stack = new Stack<int>(new int [] {1,2,3,4,5});
Console.WriteLine(SumStack(stack));

public static int SumStack(Stack<int> input)
{
    return input.Count > 0 ? input.Pop() + SumStack(input) : 0;
}
2 голосов
/ 24 апреля 2009

нюхать, нюхать, пахнет как домашнее задание для меня.

Впрочем, подсказка. Добавление всех элементов массива длины 'n' аналогично добавлению всех элементов массива длины 'n-1', а затем добавлению значения элемента 'n'.

Результатом добавления всех элементов массива длины '1' является просто значение одного элемента

1 голос
/ 24 апреля 2009

Я считаю, что вам нужно передать массив и индекс в вашей функции Sum для управления рекурсивностью.

0 голосов
/ 09 сентября 2010

Рекурсия по сути означает выполнение небольшой части и передачу большей части кому-либо еще. Теперь, если вам нужно 'n' элементов массива, вы попросите кого-нибудь дать вам сумму последних n-1 элементов, и просто сначала сам ... просто разберись со случаем, когда ничего не поделаешь ...

псевдокод будет:

   sum array start_index   =  if ( start_index >= length(array) ) return 0
                              else return array[start_index] = sum array (start_index + 1)

   print (sum array 0 )
0 голосов
/ 24 апреля 2009

Если у вас нет ничего хорошего с лямбда-выражениями или у вас только .net 2.0, это достаточно просто;

static void Main(string[] args)
{

    int[] myArray = new int[5] {1,2,3,4,5 };

    Console.WriteLine(Sum1(myArray));
    Console.Read();

}

private static int Sum1(int[] myArray)
{

    if (myArray.Length > 0)
    {
        int lengthZeroAdjusted = myArray.Length - 1;
        int element = myArray[lengthZeroAdjusted];

        Array.Resize<int>(ref myArray, lengthZeroAdjusted);
        return element + Sum1(myArray);
    }
    else
    {
        return 0;
    }
}
0 голосов
/ 24 апреля 2009

Вы хотите выполнить операцию, которую обычно называют «свернуть» или «уменьшить».

К счастью, команда .NET сделала вашу (домашнюю) работу за вас!

    static int sum(int[] values)
    {
        return values.Aggregate<int>((hd, tl) => hd + tl);            
    } 

Вы можете переписать его для удобства чтения, если хотите. ;)

РЕДАКТИРОВАТЬ: пример использования

int[] values = new int[]{1,2,3,4,5};
Console.WriteLine(sum(values));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...