2012-03-22 3 views
1

Возникли проблемы с рекурсивными методами в C#. При компиляции он должен просто отображать полное sumUpToo всего числа для данного int, то есть - вход 10 - выход 55 (10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0)Проблемы с рекурсивными методами в C#

Im не в состоянии найти какую-либо информацию в любом месте, поэтому, если у кого-то есть ссылка на сайт, который может научить меня, как пройти через него, будем очень благодарны.

class Program 
{ 
    static void Main(string[] args) 
    { 
     public static int sum(int x) 
     { 
     Console.WriteLine("num"); 
     x = Console.ReadLine(); 
     int sum = 0, i = 0; 
     for (i = 0; i <= x; i++) 

     { 
      sum = sum + i; 
     } 
     Console.WriteLine("{0}", sum); 
     } 
     public static int recursivesum(int x) 
     { 
     if (x <= 1) 
      Console.WriteLine("{0}", x); 
     else 
      (x + Recursivesum(x - 1)); 
     } 

Редактировать * Это корректировка, кажется, работает нормально сейчас, если я не ошибаюсь. Спасибо за помощь

class Program 
{ 
    static void Main(string[] args) 
    { 
     int x; 
     Console.Write("Please enter an integer value to sum up to: "); 
     x = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("The sum of all numbers up to and including {0} is {1}",x, recursivesum(x)); 
    } 

    public static int sum(int x) 
    { 
     int sum = 0, i = 0; 
     for (i = 0; i <= x; i++) 
     { 
     sum = sum + i; 
     } 
     return sum; 
    } 

    public static int recursivesum(int x) 
    { 
     if (x <= 1) 
      return x;  
     else 
      return x + recursivesum(x-1); 

    } 
} 

}

+4

См http://stackoverflow.com/questions/9831790/having-trouble-with -recursive-methods-in-c-sharp;) –

+2

Пожалуйста, отправьте код, который на самом деле * компилирует * - в настоящее время ваш метод называется recursivesum, но вы называете его как Recursivesum ... и вы его вообще не называете * в вашем 'Main'. –

+0

Это помогает рассказать нам, что он выводит сейчас. –

ответ

8

рекурсивная функция является функцией, которая называет его самостоятельно. Вам нужен базовый регистр, который выйдет из функции и рекурсивный случай, когда функция вызывает себя с измененными параметрами. Ваша функция должна выглядеть следующим образом:

public static int recursivesum(int x) 
{ 
    if (x <= 1) 
     return x; // this is the base case 
    else 
     return x + recursivesum(x-1); 
} 

Так, чтобы использовать эту функцию, вы просто назвать его так:

recursivesum(10); 

Если следовать логике функции вы увидите это возвратит 10 + recursivesum (9). recursivesum (9) вернет 9 + recursivesum (8). Итак, теперь мы имеем 10 + 9 + recursivesum (8).

Это будет продолжаться до тех пор, пока мы не достигнем точки, где у нас есть 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + recursivesum (1). Теперь, если вы снова посмотрите на функцию, recursivesum (1) снова не вызовет себя. Вместо этого он просто возвращает x. Теперь функция будет разворачиваться, и вы получите ожидаемый результат.

Последнее замечание по рекурсии. Рекурсия может быть прекрасным изящным способом реализации некоторых алгоритмов, но у нее есть свои опасности. Этот сайт не называется переполнением стека ни для чего!

+0

Спасибо за тут. Теперь это имеет гораздо больше смысла. – Nicholas

+0

отредактированный пост с обновленной функцией, спасибо за вашу помощь – Nicholas

10

У начинающих часто возникают проблемы с рекурсивными функциями. Следуйте этот образец строго и вы будете меньше шансов пойти не так:

ReturnType RecursiveFunction(ArgumentType argument) 
{ 
    if (the argument is such that the problem can be trivially solved) 
     return the trivial solution; 
    // The problem could not be trivially solved. 
    // Break it down into one or more smaller problems. 
    ArgumentType smallerProblemArgument = whatever; 
    ReturnType smallerProblemSolution = RecursiveFunction(smallerProblemArgument); 
    // We have solved the smaller problem. 
    ReturnType bigProblemSolution = ... 
    // ... use the smaller problem solution to solve the bigger problem... 
    return bigProblemSolution; 
} 

Так что в вашем случае:

public static int SumOfFirstNIntegers(int n) 
{ 
    if (n <= 0) // trivial case 
     return 0; 
    // We have a harder problem to solve. Make the problem simpler: 
    int smallerProblem = n-1; 
    int smallerSolution = SumOfFirstNIntegers(smallerProblem); 
    // We have solved the smaller problem. Use it to solve the big problem. 
    int bigSolution = smallerSolution + n; 
    return bigSolution; 
} 
+0

Вы правы, у меня были проблемы с рекурсивными функциями, но теперь у меня есть гораздо лучшее понимание, обновленная почта с правильным выходом. :) – Nicholas

+0

Возможно, по той же причине, что у новичков часто возникают проблемы с доказательствами по индукции?Я думаю, что они выполняют ту же самую умственную гимнастику. –

+0

@GregD: Это по сути то же самое, да. –

Смежные вопросы