EnglishРусский  

   hello

   square

   easymath

   runini

   easyhtml

   calendar

   samefiles

   Продолжение следует

Реклама

Инсталлятор CreateInstall
Бесплатные и коммерческие инсталляторы

easymath

Пример 1

Необходимо найти наибольший общий делитель (НОД) двух чисел.

Для решения этой задачи воспользуемся алгоритмом Евклида. Он звучит следующим образом.

НОД( x, y ) = x если y равно 0 и
НОД( x, y ) = НОД( y, x MOD y ) если y не равно 0.

x MOD y - это получение остатка от деления.
То есть, мы находим остаток от деления двух чисел и если он не равен 0, то рассматриваем уже второе число и полученный остаток от деления и т.д.

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

func uint gcd( uint first second )
{
   if !second : return first
   return gcd( second, first % second )
}

% - операция получения остатка от деления.
uint - тип обозначающий положительное целое число.
if - условный оператор, который в полном представлении имеет следующий вид.

if condition {
}
elif condition {
}
else {
}

Блоков elif может быть сколько угодно. Если условие выполнено, то будут исполняться следующие за условием операторы в фигурных скобках.

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

while 1
{
   first = uint( congetstr( "Enter the first number ( enter 0 to exit ): ", input ))
   if !first : break
   second = uint( congetstr( "Enter the second number: ", input ))
   print("GCD = \( gcd( first, second ))\n\n")
}

congetstr - функция стандартной библиотеки, которая выводит текст и получает данные от пользователя.

Пример 2

Вычислить факториал n! для n от 1 до 12. Факториал - это произведение всех чисел до данного числа включительно.

Вот какая программа может быть написана в качеcтве решения.

func uint factorial( uint n )
{
   if n == 1 : return 1
   return n * factorial( n - 1 )
}

func main<main>
{
   uint    n
   
   print("This program calculates n! ( 1 * 2 *...* n ) for n from 1 to 12\n\n")
   fornum n = 1, 13
   {
      print("\(n)! = \(factorial( n ))\n")
   }
   getch()
}

Цикл fornum выполняется пока переменная-счетчик ( в нашем случае n ) меньше значения второго выражения. На каждом шаге переменная-счетчик увеличивается на 1. fornum - частный случай более общего оператора цикла for, с которым мы много раз встретимся в дальнейшем.

for counter = expression,expression,change of the value of counter
{
}

Упражнение 3

Выведите числа Фибоначчи пока очередное число не превысит 2000000000. Для вычисления используйте рекурсивную функцию. Каждое из чисел Фибоначчи равно сумме двух предыдущих.
X0 = 1
X1 = 1
...
Xn = Xn-1 + Xn-2

Упражнение 4

Решите предыдущее упражнение без использования рекурсии.

Исходники

Редактировать