2016-08-05 3 views
-4

Benötigen Sie Hilfe bei der folgenden Frage? Ich war auf diese getestet und es versäumt, und wirklich wollen, um die Antwort kennen, so dass ich es studieren kann ....Verwenden Sie die Rekursion, um den übergeordneten Wert und den untergeordneten Wert sowie den untergeordneten Wert aller untergeordneten Elemente zu erhalten

Nehmen wir eine Liste (C#) von Objekten in Pyramidenstruktur mit den folgenden Eigenschaften:

  • ID
  • name
  • Wert
  • parentid

Beispiel (C#):

Schreiben Sie eine rekursive Funktion, die eine ID als einzigen Parameter akzeptiert und ein Array oder eine Liste mit einer unbestimmten Größe und Anzahl von Ebenen durchläuft. Die rekursive Funktion wird

berechnen
block block1 = new block(1, null, "block 1", 11.34M); 
    block block11 = new block(11, 1, "block 11", 234.34M); 
     block block111 = new block(111, 11, "block 111", 111); 
    block block12 = new block(12, 1, "block 12", 564); 
    block block13 = new block (13, 1, "block 13", 342.23M); 
     block block131 = new block(131, 13, "block 131", 945); 
     block block132 = new block(132, 13, "block 132", 10M); 
     block block133 = new block(133, 13, "block 133", 88M); 
     block block1331 = new block(1331, 133, "block 1331", 45); 

    block block2 = new block(2, null, "block 2", 234); 
    block block3 = new block(3, null, "block 3", 1249.34M); 

    blocks = new List<block>(); 
    blocks.Add(block1); 
    blocks.Add(block11); 
    blocks.Add(block111); 
    blocks.Add(block12); 
    blocks.Add(block13); 
    blocks.Add(block131); 
    blocks.Add(block132); 
    blocks.Add(block133); 
    blocks.Add(block1331); 
    blocks.Add(block2); 
    blocks.Add(block3); 

    decimal sum = SumAll(1); 
    Console.WriteLine(sum); 
    Console.ReadKey(); 
} 

Ich brauche eine Funktion, die mir total „Wert“ aus dem „Wert“ Eigenschaft für die Eltern und alle ihre Kinder und ihre Kindeskinder gibt. Kann jemand helfen?


public class block 
{ 
    public block() { } 

    public block(int id, int? parentid, string name, decimal value) 
    { 
     this.id = id; 
     this.parentid = parentid; 
     this.name = name; 
     this.value = value; 
    } 

    public int id { get; set; } 
    public int? parentid { get; set; } 
    public string name { get; set; } 
    public decimal value { get; set; } 
} 
+1

Sie können Ihre Frage bearbeiten; Versuchen Sie nicht, Code in Kommentare einzufügen. – Blorgbeard

+3

Auch: Sie müssen eine spezifischere Frage stellen. "Bitte implementieren Sie dieses Programm von meiner Kopie + eingefügte Spezifikation" ist keine Frage. Was stimmt nicht mit dem Code, den du geschrieben hast? Veröffentlichen Sie Ihren Versuch und erklären Sie genau, was es falsch macht. – Blorgbeard

+0

sieht aus, als hättest du deine Frage nicht beantwortet ... – mmcrae

Antwort

0

Um Ihnen (und hoffentlich auch die Bearbeitung Ihrer Frage mit, was Sie bisher versucht haben) sich zu bewegen, wollen Sie etwas wie folgt aus:

// defined at class level/scope outside method 
private List<block> blocks; 

... 

private int SumAll(int id) { 
     var initialBlock = blocks.FirstOrDefault(b => b.id == id); 
     int value = initialBlock.Value; 

     var childBlocks = blocks.Where(b => b.parentId = id).ToList(); 
     foreach (var childBlock in childBlocks) { 
      // recursive call for children 
      value += SumAll(childBlock.id); 
     } 

     return value; 
} 
+0

Vielen Dank! Das war hilfreich. –

0

Dies funktioniert für mich:

var lookup = blocks.ToLookup(x => x.parentid, x => x.id); 
var map = blocks.ToDictionary(x => x.id); 
Func<int, decimal> sumAll = null; 
sumAll = n => map[n].value + lookup[n].Select(x => sumAll(x)).Sum(); 

Rufen Sie einfach sumAll(1).


public decimal SumAll(List<block> blocks, int id) 
{ 
    return SumAll(id, blocks.ToLookup(x => x.parentid, x => x.id), blocks.ToDictionary(x => x.id)); 
} 

private decimal SumAll(int id, ILookup<int?, int> lookup, Dictionary<int, block> map) 
{ 
    return map[id].value + lookup[id].Select(x => SumAll(x, lookup, map)).Sum(); 
} 

Nur SumAll(blocks, 1) nennen.

+0

Danke für die Antwort. Ein bisschen kompliziert für mein Level, aber ich werde das definitiv studieren. –

+0

@HarrisStephanie - Ist das besser? – Enigmativity

+0

Ja, aber die ursprüngliche Anforderung war, dass Sie nur die Eltern-ID übergeben konnten. Wenn es diese Einschränkung nicht gab, funktioniert das gut. Danke noch einmal! –

Verwandte Themen