2016-07-03 15 views
0

Ich bin ein bisschen verwirrt über rekursive Methode von sich selbst aufrufen. Hier ist ein Beispielcode:Verwenden von Rekursion in nicht statischen Methode - C#

class Program 
{ 
public static void main(String args[]) 
{ 
    Program p = new Program(); 
    p.Foo(); 
    } 

    Public ... Foo() 
    { 
    Foo(); 
    } 

Muss ich neue Instanz des Programms erstellen Foo von Foo zu nennen? Mein Code funktioniert ohne die Instanz, aber ich bin mir nicht sicher, ob es korrekt ist.

Dank

+1

Nein, Sie müssen keine weitere Instanz erstellen. Methode 'Foo' läuft im Kontext Ihrer aktuellen Instanz. Wenn Sie' Foo' von innen aufrufen, müssen Sie die Instanz natürlich nicht angeben. –

Antwort

1

Sie brauchen nicht eine neue Instanz von Program, aber onlu von erklären Sie Foo Methode als static zu machen. Wenn Sie es so behalten, müssen Sie eine neue Instanz von Program erstellen, was ich Ihnen nicht vorschlage, weil es keine gute Übung ist, eine Klasse zu haben, die sich in einer statischen Methode instanziiert, nur um eine nicht statische zu nennen Methode. Sie sollten:

class Program 
{ 
public static void main(String args[]) 
{ 
    Foo(); //direct call to Foo 
} 

    public static ... Foo() 
    { 
    Foo(); 
    } 
} 
+0

schließlich wird dieser Code nicht funktionieren. –

+0

@SushilMate warum sagst du das? – meJustAndrew

+0

versuchen, es zu laufen :) –

0

Nein, Sie müssen keine neue Klasse erstellen. Hier ist ein (unitärstes) Beispiel.

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Collections.Generic; 

namespace UnitTestProject 
{ 
    [TestClass] 
    public class UnitTest 
    { 
     public class Factorial 
     { 
      Dictionary<int, long> store = new Dictionary<int, long>(); 

      public long Get(int number) 
      { 
       if (store.ContainsKey(number)) 
       { 
        return store[number]; 
       } 

       if (number == 0) 
       { 
        store.Add(0, 1); 
        return 1; 
       } 

       var result = number * Get(number - 1); 
       store.Add(number, result); 

       return result; 
      } 
     } 


     [TestMethod] 
     public void SomeTest() 
     { 
      // Arrange 
      var target = new Factorial(); 
      var results = new List<long>(); 

      // Act 
      for (int i = 10; i >= 0; i--) 
      { 
       results.Add(target.Get(i)); 
      } 

      // Assert 
     } 
    } 
} 
Verwandte Themen