04. februar 2006 - 18:09Der er
39 kommentarer og 3 løsninger
Rekursiv funktion
Hej
Jeg har forsøgt at lave et binært træ hvor noderne ligger i et array af objekter. Jeg ønsker at tælle noderne i træet, men jeg har lidt problemer med min rekursive funktion.
Hvis jeg skal tælle noderne skal jeg oprette en global variabel (int nodes) for ellers overskrives variablen min rekursive funktion kaldes med (int count). Er det den rigtige løsning eller kan man benytte variablen som min rekursive funktion kaldes med?
Tak
******MIN KODE******
private int countNodes(Node parent, int count) { count++; nodes++;
private void Form1_Load(object sender, System.EventArgs e) { int count=0;
node[0] = new Node(); node[1] = new Node(); node[2] = new Node(); node[3] = new Node(); node[4] = new Node(); node[5] = new Node(); node[6] = new Node();
Det skal selvfølgelig forstås som at jeg opretter et træ og skal tælle noderne rekursivt. Det er ikke meningen at jeg bare skal tage størrelsen på mit array.
Dette er gjort ved oprettelse af et array der indeholder objekter af noder. Hver node kan have childs (altså noder der ligger under parent noden "0 har altså 1 og 2 som childs").
Nu ønsker jeg så at benytte en rekursiv funktion der tæller mine noder i arrayet. Funktionen er som følger:
private int countNodes(Node parent, int count) { count++; nodes++;
Det virker egentlig godt nok, hvis jeg bare udskriver min globale variabel "nodes". Den tæller syv noder som der også er i mit træ. Mit spm er bare om jeg har mulighed for at få variablen count til at indeholde antallet af noder.
Hvorfor indeholder Node klasse ikke bare en "int" som inholder antal nodes der er i den, på den måde kan du jo også nemt lave sådan at der ikke kan addeds flere end 2 til hver Node......
Men en helt anden ting, er at jeg slet ikke forstår hvorfor du vil lave din egen klasse i stedet for at bruge det som allerede er lavet for dig......
Jeg ønsker som tidliger beskrevet oprette et binært træ, med f.eks. 7 noder (se tidligere tegning). Det har jeg gjort med min egen klasse. Derefter ønsker jeg en rekursiv funktion der tæller antallet af noder i træet. Forestil dig at jeg ikke kender array størrelsen mm. Selvfølgelig kan jeg bare tage størrelsen på mit array men det er ikke det jeg vil.
Hele denne sag drejer sig om min rekursive funktion der ikke returnere tallet 7 ved ovenstående eksempel uden jeg benytter min globale variabel.
Tror så slet ikke jeg er med på hvad du mener med et binært træ?
Hvor skal det bruges henne? Kan ikke se nogen speciel funktionalitet i det eller noget, måske derfor jeg ikke lige kan gennemskue hvordan jeg kan hjælpe dig med det... men jeg lytter da gerne med, hvis andre har en idé.....
Lyder som om du har gang i noget vildt, eller også gør du bare det hele mere besværligt end det er........
Men for at vende tilbage til din egen kode så benytter du dig jo ikke af at din contNodes returnerer en værdi. Antallet er jo lig summen af nuværende niveau + underliggende niveau. Med andre ord så glemmer du jo at fange din returværdi fra countNodes. Nb jeg har ikke testet dit eksempel da du ikke har bidraget med din node klasse.
Her et lille hurtigt eksemple på hvordan du kan ændre din nodeklasse, samt hvordan du laver din "Count" rekursivt. Bemærk at dette kan naturligvis laves på utallige måder.
namespace Example { public partial class Form1 : Form { public Form1() { InitializeComponent();
// Opret 7 noder. BinaryNode rootNode = new BinaryNode("0");
BinaryNode binaryNode1 = new BinaryNode("1"); BinaryNode binaryNode2 = new BinaryNode("2");
binaryNode1.ChildTrue = new BinaryNode("3"); binaryNode1.ChildFalse = new BinaryNode("4");
binaryNode2.ChildTrue = new BinaryNode("5"); binaryNode2.ChildFalse = new BinaryNode("6");
MessageBox.Show(rootNode.Count.ToString()); }
}
/// <summary> /// Kun et eksempel. Der er ikke taget højde for cyklisk reference! /// </summary> class BinaryNode { private BinaryNode parentNode = null; private BinaryNode childNodeTrue = null; private BinaryNode childNodeFalse = null; private string name = string.Empty;
public BinaryNode Parent { get { return this.parentNode; } set { if (value != null) { this.parentNode = value; } } }
public BinaryNode ChildTrue { get { return this.childNodeTrue; } set { if (value != null) { BinaryNode binaryNode = value; binaryNode.Parent = this; this.childNodeTrue = binaryNode; } } }
public BinaryNode ChildFalse { get { return this.childNodeFalse; } set { if (value != null) { BinaryNode binaryNode = value; binaryNode.Parent = this; this.childNodeFalse = binaryNode; } } }
public string Name { get { return this.name; } set { this.name = value; } }
public int Count { get { int value = 1; // Noden selv
if (this.childNodeTrue != null) // Bidraget fra "True" { value += this.childNodeTrue.Count; } if (this.childNodeFalse != null) // Bidraget fra "False" { value += this.childNodeFalse.Count; }
return value; } }
public BinaryNode(string name) { this.name = name; } } }
Du bør nok ha en funktion der fortæller om en node har 1 eller 2 children parent.numberofchildren() Så vidt jeg kan se har du ikke brug for at give andre værdier med til countNodes en noden der skal undersøges.
Hvis en node ikke har cildren, så returneres 1 er der 1, så tælles den op rekursivt, og 1 lægges til er der 2, så tælles de rekursivt og lægges sammen med 1
Jeg har aldrig programmeret i C#, men så vidt jeg kan se er det noget i retning af:
private int countNodes(Node parent) {
switch (Parent.numberofchildren()) { case 0: return 1; brake;
case 1: return countNodes(parent.getChild1())+1; brake;
case 2: return countNodes(parent.getChild1())+countNodes(parent.getChild2())+1; } }
Har lige før jeg gik på eksperten ændret min kode til nedenstående. Jeg havde selvfølgelig glemt at modtage returværdien i count "count=countNodes(parent.getChild1(),count)".
Hvorfor skulle det være skidt at oprette mine data i et array. Er det bare fordi du mener c# har en funktion til at oprette et binært træ?
private int countNodes(Node parent, int count) { count++;
ahhh, nu er jeg med..... men synes nu stadig tælle måden er wag ahara bruger er wag, men det er vel op til den enkelte, ved ikke hvad der er hurtigst.
// ouT
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.