Visual Basic_учебник (1108585), страница 14
Текст из файла (страница 14)
Но при этом исполнение функции в контекстеFactorial(3) еще не завершено, поэтому он еще не уничтожен. Мыпришли к ситуации, когда функция Factorial исполняется параллельно в двух различных контекстах! Во втором контексте функция вызовет себя еще раз, будет создан третий контекст. Что происходитдальше уже легко понять из следующей схемы.3*2 → 6Factorial(3)2*1 → 2Factorial(2)1*1 → 1Factorial(1)1Factorial(0)Рис.
11 Рекурсивное вычисление факториалаВ контексте Factorial(0) функция не будет вызывать сама себя, авернет значение 1, после чего данный контекст будет уничтожен за ненадобностью. В контексте Factorial(1) полученное значение будетиспользовано в вычислении, и результат возвращен в качестве значения функции. И так далее. В конечном итоге подпрограмма WriteLineпросто напечатает окончательно вычисленное значение факториалатрех, а именно число 6.Рекурсия является полезным приемом программирования по нескольким причинам.
Во-первых, рекурсивные определения часто используются в математике. Например, компактная математическая запись рекурсивного определения факториала выглядит так:101! =1=0∙ −1 ! >0Подобные определения всегда включают «тривиальный» случай, когдаопределение дается напрямую. В нетривиальных случаях определениедается через «более простое» определение. В данном случае «болеепростое» означает от меньшего числа .Во-вторых, рекурсия – не менее мощный прием программирования,чем, скажем, циклы. Это означает, что любой алгоритм, использующийциклы, можно переформулировать без циклов, но с рекурсивнымифункциями.В качестве иллюстрации приведем лишь один пример. Выше мы подробно обсуждали программу для решения алгебраических уравненийметодом деления отрезка пополам.
В формулировке задачи на странице 83 уже были косвенно использованы элементы рекурсии. Приведем теперь эти элементы в явном виде.Дано: и такие, что знаки значений () и () различны.Требуется:найти корень уравнения = 0 с заданной точностью .Тривиальный случай − < :корень уравнения =+.2Рекурсивное определение:корень на [, ] равен корню на одном из отрезков, по длине в двараза меньших, – либо [,+],2+, ],2+.2либо [значений функции в точках , и102в зависимости от знаковВ этом виде формулировка метода напрямую переводится в программу на VB с рекурсивной функцией. В заключение, приведем эту программу целиком.Function f(ByVal x As Double) As DoubleReturn Math.Exp(-x) - xEnd FunctionFunction Dichotomy(ByVal a As Double, _ByVal b As Double, _ByVal Fa As Double, _ByVal Fb As Double, _ByVal eps As Double) As DoubleDim c As Double = (a + b) / 2If Math.Abs(a - b) < eps ThenReturn cElseDim Fc As Double = f(c)If Math.Sign(Fa) <> Math.Sign(Fc) ThenReturn Dichotomy(a, c, Fa, Fc, eps)ElseReturn Dichotomy(c, b, Fb, Fc, eps)End IfEnd IfEnd FunctionSub Main()' Поиск корня уравнения f(x) = 0 на [0,1]Dim eps As Double = 0.000001Dim a As Double = 0Dim b As Double = 1Dim c As Double = Dichotomy(a, b, f(a), f(b), eps)Console.WriteLine("Решение: x={0}, f(x)={1:F7}", _c, f(c))Console.ReadLine()End Sub103ЗаключениеКак невозможно изучить иностранный язык без разговорной практики,так невозможно научиться программировать, не составляя конкретныхпрограмм.
Учебный материал этого пособия дал вам минимально необходимые сведения о программировании на языке Visual Basic. Однако, теоретического изучения этих азов совершенно недостаточно дляовладения практическими навыками программирования.
Поэтому естественным продолжением данного теоретического курса являетсявыполнение заданий из методической разработки «Численные методы. Практикум программирования».Желающим получить более основательное представление о программировании вообще, и о возможностях языка Visual Basic в частности,мы рекомендуем обратиться к публикациям в разделе Литература(стр. 109)104Приложение 1. Комбинации клавишНекоторые комбинации клавиш, повышающие скорость работы в интегрированной среде Microsoft Visual Basic 2008.РедактированиеCtrl+CCtrl+XCtrl+VCtrl+ACtrl+ZShift+ Ctrl+ZShift+Alt+EnterCtrl+FCtrl+HCtrl+ICtrl+Shift+ICtrl+JAlt+Right ArrowCtrl+K, Ctrl+XCopyCutPasteSelect AllUndoRedoFull ScreenQuick FindQuick ReplaceQuick InfoParameter InfoList MembersComplete WordInsert SnippetКопировать в буферВырезать в буферВставить из буфераВыделить весь текстОтменить редактированиеВосстановить редактированиеВ полноэкранный режимНайтиЗаменитьИнформация о методеИнформация о параметрахСписок вариантов именЗавершить имя автоматически1Вставить заготовкуОтладкаF5F8Shift+F8Start DebuggingStep IntoStep OverF9Toggle BreakpointCtrl+Shift+F9Delete All BreakpointsЗапуск в режиме отладкиСделать шаг и остановитьсяСделать шаг без перехода вфункцию/подпрограммуУстановить/снять точку останова в текущей строкеСнять все установленные точкиостанова1Заготовки – шаблоны часто используемых конструкций VB, таких как If … Else… End If и др.105Приложение 2.
Сводка синтаксических правилОбщие правила (стр. 16)Программа записывается в виде последовательности предложений(statement).Простое предложение обычно располагается на отдельной строкетекста.В состав имени могут входить ТОЛЬКО буквы, цифры и знаки подчеркивания.Первым символом должна быть буква.Регистр букв в имени не имеет значения.Имя не должно совпадать ни с одним из зарезервированных слов.Описание переменной (стр. 20)Dim <имя переменной> As <имя типа> _[ ,<имя переменной> As <имя типа> ] …Описание константы (стр.
28)Const <имя константы> As <имя типа> = <значение>Предложение присвоения значения переменной (стр. 30)<имя переменной> = <выражение>106Цикл For … Next (стр. 34)For <переменная> [As <тип>] = <нач_знач> To <кон_знач> _[Step <шаг>]<блок предложений>Next [<переменная>]Вызов метода объекта (стр. 43)<значение>.<имя_метода> [ (<параметры>) ]Выражение конструирования объекта (стр. 55)New <имя класса> ( <параметры конструктора> )Цикл Do … Loop (стр.
78)Do [ While | Until ] <условие><блок предложений>LoopDo<блок предложений>Loop [ While | Until ] <условие>Условное предложение If … End If (стр. 81)If <условие 1> Then<блок предложений 1>[ Else If <условие 2> Then<блок предложений 2> ] …[ Else<блок предложений иначе> ]End If107Функция (стр. 90)Function <имя> ( [ <параметр1> [ , <параметр2> ] … ] ) _As <тип результата><блок предложений, включая Return>End FunctionПодпрограмма (стр. 90)Sub <имя> ( [ <параметр1> [ , <параметр2> ] … ] )<блок предложений>End SubОписание параметра функции или подпрограммы (стр.
92)[ ByVal | ByRef ] <имя параметра> As <имя типа>Предложение выхода из функции или подпрограммы (стр. 93)Return <выражение>Предложение вызова подпрограммы (стр. 93)[ Call ] <имя подпрограммы> ( [ <аргумент 1> _[ , <аргумент 2> ]… ] )108Литература1. Калугина О.Б., Люцарев В.С. Численные методы.
Практикумпрограммирования. – М.: Множ. лаб. Химического факультетаМГУ, 20082. Гарнаев А.Ю. Visual Basic .NET: разработка приложений. — Спб.:БХВ-Петербург, 2002.3. Microsoft Developer Network. Visual Basic Developer Center[http://msdn2.microsoft.com/ru-ru/vbasic]4. Борисенко В. В. Основы программирования. – М.: Интернет ун-т информ. Технологий, 20055. Вирт Н. Алгоритмы+структуры данных=программы. – М.:Мир, 19896.
Кнут Д. Искусство программирования. Т. 1 Основные алгоритмы. Т.2 Получисленные алгоритмы. Т. 3 Сортировка и поиск. –Спб.: Вильямс, 2007109.