Автор работы: Пользователь скрыл имя, 11 Декабря 2013 в 09:46, дипломная работа
Цель работы – рассмотрение методических аспектов преподавания рекурсии в школьном курсе информатики, которые позволят совершенствовать учебный процесс и послужат основой формирования информационной культуры учащихся.
Задачи могут быть сформулированы следующим образом:
1. Выявить роль рекурсии при обучении алгоритмизации в школьном курсе информатики.
2. Провести краткий анализ методов рекурсивного программирования в обучении решению прикладных задач.
3. Систематизировать существующий понятийный аппарат рекурсии в информатике с целью создания простого и ясного языка описания рекурсивных алгоритмов и процессов, а на его базе - методики обучения алгоритмизации на основе рекурсии.
Введение 3
Глава 1. Теоретические основы изучения рекурсии 5
1.1.Понятие рекурсии и ее виды 5
1.2. Методы рекурсивного программирования 14
Глава 2. Методика изучения основ рекурсии на уроках информатики 21
2.1. Методические рекомендации по изучению основ рекурсии 21
2.2. Методические разработки уроков по изучению основ рекурсии 35
Заключение 50
Литература 51
Программа на языке Паскаль:
type
st = (left, middle, right);
nat = 1..maxint;
var
m: nat; {m – число дисков}
procedure move(n: nat; s1, sw, sk: st);
{перемещение n дисков с s1 на sk}
procedure step;
{перемещение одного диска с s1 на sk}
procedure print(s: st);
begin
case s of
left: write(' лев. ');
middle: write(' средн. ');
right: write(' прав. ')
end;
end;
begin {step}
write(' снять диск с ');
print(s1);
write(' надеть на ');
print(sk);
writeln
end;
begin {move}
if n = 1 then
step
else begin
move(n - 1, s1, sk, sw);
step;
move(n-1, sw, s1, sk)
end
end;
begin
read(m); {число дисков}
writeln('для ', m:3, ' дисков следует произвести ',
'следующие действия:');
move(m, left, middle, right);
readln
end.
Рассмотрим следующий пример: пусть требуется написать программу, для построения такой фигуры, изображенной на рисунке.
Фигура представляет собой равнобедренный прямоугольный треугольник с длиной катета равной a. Внутри него располагаются три равных треугольника (также прямоугольных и равнобедренных). Катеты внутренних треугольников в 2 раза меньше катетов внешнего. Каждый из внутренних треугольников также содержит внутри себя по три треугольника, которые в свою очередь могут содержать еще более маленькие треугольники и так далее.
Собственно, в самом описании геометрической фигуры полностью изложен механизм рекурсивного решения данной задачи. Любой внутренний треугольник по структуре ничем не отличается от внешнего. Таким образом, требуется написать подпрограмму, которая построит треугольник, а затем вызовет саму себя для построения трех меньших треугольников внутри данного. Терминальным условием в этом случае будет ситуация, когда длина катета меньше либо равна 1 (катет превращается в одну точку).
Подпрограмма для решения такой задачи может выглядеть, например, так:
procedure triangle(x,y,a:integer); {пусть (x,y) — положение прямого угла, a — длина катета}
begin
line(x, y, x + a, y);
line(x, y, x, y - a);
line(x + a, y, x, y - a); {построили контур большого треугольника}
if (a>1) then begin {если
наш треугольник должен
triangle(x, y, a div 2); {меньший треугольник, у которого общий с большим прямой угол}
triangle(x, y — a div 2, a div 2); {верхний треугольник}
triangle(x + a div 2, y, a div 2); {правый треугольник}
end;
end;
При написании данной процедуры считается, что ось Y экрана направлена сверху вниз, поэтому чем выше точка, тем меньше будет ее координата.
Кстати, на примере этого решения хорошо видно, что рекурсию не всегда легко заменить циклом.
Рассмотрим еще один пример: пусть требуется написать подпрограмму для изображения серии вложенных окружностей. Окружность диаметра d содержит внутри себя 4 одинаковых окружности диаметра d/2, которые касаются ее в верхней, нижней, правой и левой точках. С свою очередь каждая из четырех внутренних окружностей также содержит внутри еще по 4 окружности меньшего диаметра и так далее.
Аналогично предыдущей
задаче, любая из внутренних окружностей
есть полное подобие внешней. Окончание
рекурсивных вызовов будет
Подпрограмма для решения этой задачи может выглядеть, например, так:
procedure circles(x,y, r : integer); {пусть (x,y) — координаты центра окружности, r - радиус }
begin
circle(x,y,r);
if (r>=2) then begin
circles(x — r div 2, y, r div 2);
circles(x + r div 2, y, r div 2);
circles(x, y — r div 2, r div 2);
circles(x, y + r div 2, div 2);
end;
end;
Аналогично предыдущей задаче данная подпрограмма строит только контур большой окружности, а всю работу по построению внутренних перекладывает на свои собственные копии, но вызванные с другими параметрами.
Рассмотрим применение рекурсивного алгоритма в жизненной ситуации.
Моделирование работы автопарковки
Имеется автопарковка, на которую автомобили ставятся в один ряд. Длина автопарковки — N метров. Ширина автомобиля — x метров. К сожалению, на парковке отсутствует разметка — то есть каждый подъезжающий водитель находит произвольное (случайное) место, достаточное для размещения автомобиля и ставит туда свою машину. Если не осталось свободного места ширины достаточной ширины, то парковка считается заполненной. Требуется смоделировать данный процесс и определить, сколько автомобилей будет помещаться на парковке при полном заполнении (если процесс моделирования повторить несколько раз, то можно получить достаточно точную статистику и определить, сколько автомобилей в среднем будет находиться на этой стоянке).
Ключевым данным в этой задаче является то, что водитель находит произвольное место. То есть он не обязан размещать свою машину вплотную к уже имеющимся.
На рисунке показано возможное размещение автомобилей.
Идея решения: представим всю парковку в виде отрезка числовой прямой от 0 до N. Тогда первый автомобиль поделит этот отрезок на две части — слева от автомобиля и справа. Каждый из полученных отрезков мы можем рассматривать независимо и заполнять по тем же правилам, что и основной.
Продемонстрируем процесс моделирования на рисунках:
Начальная ситуация: Дана незанятая парковка
Первый этап. В произвольное (случайно выбранное) место поставлен автомобиль. Пусть левая граница автомобиля имеет координату a, тогда правая a+x.
Получилось два отрезка: [0; a] и [a+x; N], для каждого из которых необходимо решить точно такую же задачу — разместить автомобили.
Подпрограмма для решения этой задачи моделирования может выглядеть так:
function Cars(left, right : real) : integer;
var
place: real;
begin
if right-left<x then Cars:=0
{терминальное условие: на
else begin
place:=random*((right-x)-left) + left; { случайно выберем левую границу автомобиля}
Cars:=Cars(left, place) + Cars (place + x, right);
end;
end;
Стоит обратить внимание на формулу place:=random·((right-x)-left) + left. Здесь random — это функция, генерирующее случайное число в интервале [0; 1]. Левая граница автомобиля не может находиться ближе чем на расстоянии x от правого края парковки (иначе правая часть автомобиля окажется за пределами парковки), поэтому ширина дипазона случайных чисел (множитель при random) взята не (right-left), а ((right-x)-left). Внутренние скобки здесь носят логический, а не математический характер. Понятно также, что координата левой границы автомобиля не может быть меньше, чем левая граница отрезка. Отсюда последнее +left в формуле.
IV. Домашнее задание;
Напишите рекурсивную программу построения фигуры.
В настоящее время
область практического
Значимость рекурсии определяется тем, что она является одним из наиболее мощных, а также самым общим методом научного познания. Она эффективно применяется во многих прикладных и теоретических естественнонаучных дисциплинах, и стала неотъемлемой их частью.
На основании проведенной работы можно сделать несколько выводов:
Рекурсия отражает черту абстрактного мышления, проявляющуюся в самых различных приложениях (в математике, синтаксическом анализе и трансляции, древовидной сортировке и обработке данных с динамической структурой, шахматных задачах и т.д.). Именно в задачах такого рода лучше применять рекурсивные алгоритмы, так как они, избавляют от необходимости последовательного описания процессов, к тому же, практически все действующие языки программирования поддерживают рекурсию.
Информация о работе Методические аспекты преподавания основ рекурсии