2009-04-24 2 views
0

Теперь, когда я использую рекурсию для вычисления суммы чисел, я хочу сделать что-то немного другое. Ниже приведен мой код, который суммирует числа 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; 
     } 
    } 
+1

ОК, видимо, мы делаем домашнее задание людей для них :( –

+1

@Paul: Я думаю, что 15 представителей за «принятую» галочку (плюс вверху, которую можно получить) просто заманчивы. – Tomalak

ответ

2

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

Однако, подсказка. Добавление всех элементов массива длины «n» совпадает с добавлением всех элементов массива длины «n-1», а затем добавление значения элемента «n».

В результате сложения всех элементов массива длины «1» только значение одного элемента

1

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

3

Что об использовании 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

Слишком много новых концепций ошибок. ;-) – Tomalak

0

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

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

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

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

EDIT: пример использования

int[] values = new int[]{1,2,3,4,5}; 
Console.WriteLine(sum(values)); 
+1

Поскольку System.Array реализует IEnumerable, вам не нужно преобразовывать массив в List, а параметр типа метода Aggregate может быть выведен компилятором: return values.Aggregate ((hd, tl) = > hd + tl); – CMS

+0

Дох, ты абсолютно прав. Не уверен, что я там думал.Отредактировано, чтобы отразить вашу точку зрения. – dss539

0

Из если ваш ничего хорошего с лямбда-выражения или у вас есть только .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

Итак, в этом методе мы передаем массив myArray. Затем мы устанавливаем lengthZeroAdjusted на myArray.Length - 1, который будет 5 - 1 (4). Итак, что такое следующая строка, используемая для: Array.Resize (ref myArray, lengthZeroAdjusted); Susan – 2009-04-24 17:01:32

+0

Hi there Susan :) Думаю, что вам нужно что-то по тем же линиям, что и ваш первоначальный пример, чтобы облегчить понимание. Я предполагаю, что здесь есть другие, вы можете быть новичком в программировании. Извиняюсь, если это не так. Чтобы функция оставалась верной типу «массив», о котором вы просили, я просто поддерживал тип. Поступая таким образом, мы имеем дело с типом массива несколько иначе, чем с некоторыми другими предложениями. – 2009-04-24 18:32:43

+0

Чтобы описать то, что нужно подробно, так что вся функция принимает массив, нужно, чтобы мы изменяли массив каждый раз, когда мы повторяем. Подобно стеку http://en.csharp-online.net/Generic_Stack функционально. Мы берем последнее значение в массиве и сохраняем его в элементе, теперь мы можем уменьшить размер массива на 1, передав lengthZeroAdjusted, в котором всегда будет 1 меньше myArray. – 2009-04-24 18:33:14

5
let seq = [1;2;3;4;5] 

let rec samp nums = 
    match nums with 
    | []  -> 0 
    | h::t -> h + samp t 
+1

Мне это нравится. Полностью не правдоподобно для OP, чтобы представить это как домашний ответ, учитывая, что уровень опыта показал исходный вопрос :) –

+0

Я хотел дать ей подсказку, не давая ей ответ :) –

+0

ОК, я кусаю. Из любопытства, для моей культуры, на каком языке? Некоторый функциональный язык наверняка, но их так много ... :-) – PhiLho

0

Рекурсия по существу означает, что делает небольшую часть, и дает большую часть кому-то еще. Теперь, если вам нужно «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) 
3
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)); 
} 

Я начинающий тоже, но это мое решение, и это работает для меня.

Смежные вопросы