Возврат рекурсивного вызова Список, возвратите тип, вызывающий меня проблемы

Хорошо Haskell только в 1.8 раза медленнее, чем C++ GCC, который быстрее, чем реализация GCC C для типичных задач сравнительного теста. Это делает Haskell очень быстро, еще быстрее, чем C# (Моно, который является).

относительная скорость Языка

  • 1,0 C++ GNU g ++
  • 1,1 C GNU gcc
  • 1.2 ATS
  • 1.5 Java 6 - сервер
  • 1.5 Чистых
  • 1.6 Pascal Free Pascal
  • 1.6 Фортрана Intel
  • 1.8 Haskell GHC
  • 2.0 Моно C#
  • 2,1 GNAT Scala
  • 2.2 Ada 2005
  • 2,4 источника Lisp SBCL
  • 3.9 Lua LuaJIT

Для записи я использую Lua для Игр на iPhone, таким образом Вы могли легко использовать Haskell или Lisp, если Вы предпочитаете, так как они быстрее.

15
задан mrblah 1 October 2009 в 13:54
поделиться

3 ответа

В настоящее время вы не показали ничего, что фактически добавляло бы одну категорию в список ... Я предполагаю, что при повторении вы хотите добавить результаты Get (categoryId) также ·

Решение Прита, безусловно, будет работать, но здесь ' s альтернатива, которая позволяет избежать создания всех дополнительных списков:

public List<Category> GetAllChildCats(int categoryId)
{
    List<Category> ret = new List<Category>();
    GetAllChildCats(categoryId, ret);
    return ret;
}

private void GetAllChildCats(int categoryId, List<Category> list)
{
    Category c = Get(categoryid);
    list.Add(c);

    foreach(Category cat in c.ChildCategories)
    {
        GetAllChildCats(cat.CategoryID, list);
    }
}

Это создает единый список и добавляет в него элементы по мере его выполнения.

Один момент - если у вас уже есть дочерняя Категория объектов, вам действительно нужно снова вызвать Get ? Каждый дочерний элемент содержит только свой идентификатор, пока вы не получите всю категорию?

44
ответ дан 1 December 2019 в 00:02
поделиться
   foreach(Category cat in c.ChildCategories)
      {
              list.AddRange( GetAllChildCats(cat.CategoryID) )

      }

и не забывайте

return list;
12
ответ дан 1 December 2019 в 00:02
поделиться

Я думаю, что эта версия linq позволит вам избежать накладных расходов на создание списка:

public IEnumerable<Category> GetAllChildCats(int categoryid)
{
    Category c = Get(categoryid);
    return new[] { c }.Concat(c.ChildCategories.SelectMany(cat => GetAllChildCats(cat)));
}

Вы всегда можете вызвать ToList () для возвращенного IEnumerable, если вам это нужно.

2
ответ дан 1 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: