Инструменты пользователя

Инструменты сайта


bb:redbook:204

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
bb:redbook:204 [2017/08/30 09:31]
prospero78 [2. Вычисление факториала]
bb:redbook:204 [2017/08/30 09:51]
prospero78 [3. Примечания]
Строка 23: Строка 23:
   Hello11.odc   Hello11.odc
  
 +<code=oberon2>
 +MODULE TestHello11;
 + (* это программа на языке
 + Компонентный Паскаль. Она показывает
 + как можно вычислить произвольный факториал рекурсией. *)
 +
 + IMPORT мВв := In,
 + мЛог := Log;
 +
 + PROCEDURE Факт_Получ (пцФактор: INTEGER): INTEGER;
 + BEGIN
 + IF пцФактор = 1 THEN
 + мЛог.String('Достигнуто дно  '); мЛог.Ln;
 + RETURN 1
 + ELSE
 + мЛог.String('пцФактор='); мЛог.Int(пцФактор); мЛог.Ln;
 + RETURN пцФактор * Факт_Получ(пцФактор - 1);
 + END;
 + END Факт_Получ;
 +
 + PROCEDURE Старт*;
 + VAR
 + цФактор: INTEGER; (* факториал *)
 + цБаза: INTEGER; (* основание факториала *)
 +
 + BEGIN
 + мЛог.String('Введите основание факториала: ');
 + мВв.Open;
 + мВв.Int(цБаза); мЛог.Ln;
 + мЛог.String('BEGIN цБаза='); мЛог.Int(цБаза); мЛог.Ln;
 + цФактор := Факт_Получ(цБаза);
 + мЛог.String('f('); мЛог.Int(цБаза); мЛог.String(')= '); мЛог.Int(цФактор); мЛог.Ln;
 + END Старт;
 +
 +BEGIN
 +END TestHello11.
 +
 +"6" выделить перед пуском!!!
 +
 +^TestHello11.Старт 6 
 +</code>
        
  
-Обратите внимание, что в этом примере можно было использовать только одну переменную для вычисления факториала, если бы вывод в "Log.Int(f)выполнялся через вызов "Log.Int(GetFactorial(n))". Соответственно, строку выше можно было бы удалить и отказаться от объявления переменной "f".+Обратите внимание, что в этом примере можно было использовать только одну переменную для вычисления факториала, если бы вывод в ''мЛог.Int(цФактор)'' выполнялся через вызов ''мЛог.Int(Фактор_Получ(пцФактор))''. Соответственно, строку выше можно было бы удалить и отказаться от объявления переменной "пцФактор".
  
 Вывод программы представлен ниже: Вывод программы представлен ниже:
  
 +  компилируется "TestHello11"   220   0
 +  Введите основание факториала: 
 +  BEGIN цБаза= 6
 +  пцФактор= 6
 +  пцФактор= 5
 +  пцФактор= 4
 +  пцФактор= 3
 +  пцФактор= 2
 +  Достигнуто дно  
 +  f( 6)=  720
      
-Как видно из вывода переменная "n" с каждым вызовом действительно уменьшалась на "1", и это была настоящая рекурсия. :-)+Как видно из вывода переменная ''цБаза'' с каждым вызовом действительно уменьшалась на "1", и это была настоящая ''рекурсия''. :-)
  
 ====3. Примечания==== ====3. Примечания====
   
- [↑] Вообще, вычисление в настоящем случае факториала через рекурсию — довольно неэффективный алгоритм. Надо стараться искать обходные пути. Вообще с рекурсией надо быть очень внимательным, так как неограниченная рекурсия мгновенно вызовет переполнение стека. На этом принципе работают чуть ли не половина вирусов для MS Windows. Можно отдельно почитать статью с множеством технических подробностей на http://codenet.ru/.+Вообще, вычисление в настоящем случае факториала через [[https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F|рекурсию]] — довольно //неэффективный// алгоритм. Надо стараться искать обходные пути. Вообще с рекурсией надо быть очень внимательным, так как //неограниченная// рекурсия мгновенно вызовет переполнение стека. На этом принципе работают чуть ли не половина вирусов для **MS Windows**. Можно отдельно почитать статью с множеством технических подробностей на http://codenet.ru/.
  
bb/redbook/204.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)