Данная программа отличается двумя интересными свойствами. Во-первых, обратите внимание на то, как в ней проверяется наличие аргументов командной строки перед тем, как продолжить выполнение. Это очень важное свойство, которое можно обобщить. Если в программе принимается во внимание наличие одного или более аргументов командной строки, то в ней должна быть непременно организована проверка факта передачи ей предполагаемых аргументов, иначе программа будет работать неправильно. Кроме того, в программе должна быть организована проверка самих аргументов перед тем, как продолжить выполнение. Так, в рассматриваемой здесь программе проверяется наличие командного слова "зашифровать" или "расшифровать" в качестве первого аргумента командной строки.

И во-вторых, обратите внимание на то, как программа возвращает код своего завершения. Если предполагаемые аргументы командной строки отсутствуют или указаны неправильно, программа возвращает код 1, указывающий на ее аварийное завершение. В противном случае возвращается код 0, когда программа завершается нормально.

<p>Рекурсия</p>

В C# допускается, чтобы метод вызывал самого себя. Этот процесс называется рекурсией, а метод, вызывающий самого себя, — рекурсивным. Вообще, рекурсия представляет собой процесс, в ходе которого нечто определяет самое себя. В этом отношении она чем-то напоминает циклическое определение. Рекурсивный метод отличается главным образом тем, что он содержит оператор, в котором этот метод вызывает самого себя. Рекурсия является эффективным механизмом управления программой.

Классическим примером рекурсии служит вычисление факториала числа. Факториал числа N представляет собой произведение всех целых чисел от 1 до N. Например, факториал числа 3 равен 1х2x3, или 6. В приведенном ниже примере программы демонстрируется рекурсивный способ вычисления факториала числа. Для сравнения в эту программу включен также нерекурсивный вариант вычисления факториала числа.

// Простой пример рекурсии.

using System;

class Factorial {

  // Это рекурсивный метод.

  public int FactR(int n) {

    int result;

    if (n == 1) return 1;

    result = FactR(n - 1) * n;

    return result;

  }

  // Это итерационный метод.

  public int FactI(int n) {

    int t, result;

    result = 1;

    for (t = 1; t <= n; t++) result *= t;

    return result;

  }

}

class Recursion {

  static void Main() {

    Factorial f = new Factorial();

    Console.WriteLine("Факториалы, рассчитанные рекурсивным методом.");

    Console.WriteLine("Факториал числа 3 равен " + f.FactR(3));

    Console.WriteLine("Факториал числа 4 равен " + f.FactR(4));

    Console.WriteLine("Факториал числа 5 равен " + f.FactR(5));

    Console.WriteLine();

    Console.WriteLine("Факториалы, рассчитанные итерационным методом.");

    Console.WriteLine("Факториал числа 3 равен " + f.FactR(3));

    Console.WriteLine("Факториал числа 4 равен " + f.FactR(4));

    Console.WriteLine("Факториал числа 5 равен " + f.FactR(5));

  }

}

При выполнении этой программы получается следующий результат.

Факториалы, рассчитанные рекурсивным методом.

Факториал числа 3 равен 6

Факториал числа 4 равен 24

Факториал числа 5 равен 120

Факториалы, рассчитанные итерационным методом.

Факториал числа 3 равен 6

Факториал числа 4 равен 24

Факториал числа 5 равен 120

Принцип действия нерекурсивного метода FactI() вполне очевиден. В нем используется цикл, в котором числа, начиная с 1, последовательно умножаются друг на друга, постепенно образуя произведение, дающее факториал.

Перейти на страницу:

Похожие книги