2015-05-09 2 views
1

Итак, есть блог this, который дает пять проблем программирования, каждый из которых должен решить каждый инженер-программист менее чем за 1 час, и я просто пересматриваю некоторые концепции.C# удалить элемент из списка целых чисел int [] l = {1,2,3} - или использовать рекурсию для их добавления

Первый вопрос читает

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

Очевидно, что для- и в то время как-петли легко, но я начал с

int[] l = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; 

ли это вообще возможно, чтобы совать элемент из списка, а затем передать укороченный лист каждый раз?

Попытка я видел в Python:

numbers = [1,2,3,4,5,6,7,8,9] 
def recurse_count(lst): 
    if len(lst) == 1: 
     return lst[0] 
    else: 
     i = len(lst) - 1 
     subtotal = lst[i] + lst[i - 1] 
     lst.pop() #into the void with you 
     lst[-1] = subtotal 
     return recurse_count(lst) 

Можно ли с межд [] в C#?

ответ

2

Очень элегантное решение будет:

static public int sumThisUp(IEnumerable<int> list) 
{ 
    return list.FirstOrDefault() + (list.Any() ? sumThisUp(list.Skip(1)) : 0); 
} 
+0

Действительно, элегантный и эффективный, но я бы скорее назвал '.Any()' not на 'list', но на' list.Skipt (1) '(может быть, ввести локальную переменную?) –

+0

@AlexSikilinda Это более элегантно без локальной переменной. Я не указывал на эффективное или быстрое решение, а на однострочный. :) –

2

Да. Я действительно верю, что класс List имеет простой метод removeAt (int). Рекурсивный метод будет выглядеть следующим образом:

public int sumThisUp(List<int> list) { 
    int result = list[0]; 
    list.removeAt(0); 
    return (list.length > 0) ? result + sumThisUp(list) : result; 
} 

В качестве альтернативы, если вы не Wanna Внесите изменения в список Orginal это будет делать:

public int sumThisUp2(List<int> list, int index = 0) { 
    int result = list[index++]; 
    return (list.Count > index) ? result + sumThisUp2(list, index) : result; 
} 
+0

Изменение списка в такой функции, безусловно, плохая идея. –

+0

@AlexSikilinda да, но это точка –

+0

Большое спасибо, кажется, я бы не смог использовать int [] l хотя .... –

1

Да, это возможно в C#. Но я хочу сначала ввести трюк: вместо изменения исходного списка мы можем просто передать начальный индекс. Это будет гораздо быстрее:

private static int Sum(int[] array, int startIndex) 
{ 
    if (startIndex >= array.Length) 
    { 
     return 0; 
    } 
    return array[startIndex] + Sum(array, startIndex + 1); 
} 

static void Main(string[] args) 
{ 
    int[] array = new int[] { 1, 2, 3, 4 }; 
    int result = Sum(array, 0); 
    Console.WriteLine(result); 
} 
1

Это следует сделать это:

public int Sum(int[] numbers, int startAt = 0) 
{ 
    if (startAt == numbers.Length) 
     return 0; 
    return numbers[startAt] + Sum(numbers, startAt + 1); 
} 
Смежные вопросы