Национальный исследовательский ядерный университет «МИФИ»
Опубликован: 09.01.2004 | Доступ: свободный | Студентов: 3805 / 326 | Оценка: 4.02 / 3.77 | Длительность: 10:03:00
ISBN: 978-5-9556-0009-3
Самостоятельная работа 4:

Рекурсивные вычисления

< Лекция 10 || Самостоятельная работа 4 || Лекция 11 >
Аннотация: Цель: ознакомление с принципами работы механизма рекурсии

Теоретические сведения

Рекурсивно определенная функция содержит в своем определении ссылку на саму себя. Важными областями примемения индукции в математике являются индуктивные определения и доказательства.

Рекурсия в языке программирования SML определяется по аналогии с традиционной математической индукцией. Например, определение функции вычисления факториала в терминах математической индукции имеет вид:

  1. базис индукции: 0!=1 ;
  2. шаг индукции: n!=n*(n-1)!.

Программный проект, реализующий соответствующую функцию на языке на SML, имеет вид:

structure Project2
: sig val main: string option array 
  option -> unit
end =
struct
     
fun factorial 0 = 1 | 
  factorial (n:int) = n * factorial (n-1);
fun main (a : string option array option) =
  (*@TODO: add your code here *)
(
  print ("factorial(4) = 
         " ^ Int.toString(factorial(4)) ^ "\n"
)
end

Пользуясь условным выражением if языка программирования SML, функцию вычисления факториала можно представить следующим фрагментом программы:

fun factorial n = if (n<2) 
then 1 else n * factorial(n-1);

Возможно рекурсивное определение не только функций, но и типов.

Например, определение списочного типа на языке SML имеет вид:

datatype slist = 
    nil | element of char * slist;

Задание

Сформулируйте формальную постановку задачи, запишите правила вывода и реализуйте программу на SML в соответствии с вариантом исполнения.

Реализовать на языке SML следующие рекурсивные функции:

  1. Предшествования для целых чисел.
  2. Следования для целых чисел.
  3. Суммы первых N чисел натурального ряда.
  4. Произведения первых N чисел натурального ряда (факториала).
  5. Вычисления чисел Фибоначчи.
  6. Решения задачи о размещении 8 ферзей на шахматной доске 8х8 так, чтобы никакой из них они не "бил" другого.
  7. Решения задачи о "Ханойских башнях".
  8. Упорядочения массива.
  9. Обхода двоичного дерева слева.
  10. Обхода двоичного дерева справа.
  11. "Балансировки" двоичного дерева
  12. Подсчета количества элементов двоичного дерева.
  13. Упорядочения списка.
  14. Вставки элементов в упорядоченный список.
  15. Вставки элементов в "сбалансированное" двоичное дерево.
  16. Наибольшего общего делителя по алгоритму Евклида.
  17. Суммы N элементов арифметической прогрессии.
  18. Суммы N элементов геометрической прогрессии.
  19. Решения задачи о ханойских башнях (перемещение диска со стержня А на стержень В отображать посредством вывода текста " А->В ").
  20. Суммы элементов списка.
  21. Инвертирования списка.
  22. Произведения с использованием только функции сложения.
  23. Суммы с использованием только функции прибавления единицы.
< Лекция 10 || Самостоятельная работа 4 || Лекция 11 >