Помощь в учёбе, очень быстро...
Работаем вместе до победы

Примеры решения задач

РефератПомощь в написанииУзнать стоимостьмоей работы

Задача 7.4. Напишите функцию, которая по заданному вещественному х строит бесконечный список, элементами которого являются члены разложения функции sin х в ряд Тейлора в окрестности нуля. Решение. Легко построить возрастающую последовательность чисел Фибоначчи и отдельно последовательность степеней двойки. Вот соответствующие выражения: power2 = iterate (*2) 1. Если транспонировать матрицу… Читать ещё >

Примеры решения задач (реферат, курсовая, диплом, контрольная)

Задача 7.1. Постройте бесконечную возрастающую последовательность натуральных чисел, состоящую из всех чисел Фибоначчи и степеней двойки. Начальный отрезок такой последовательности будет выглядеть следующим образом:

[1, 2, 3, 4, 5, 8, 13, 16, 21,…

Решение. Легко построить возрастающую последовательность чисел Фибоначчи и отдельно последовательность степеней двойки. Вот соответствующие выражения: power2 = iterate (*2) 1.

fibonacci = 1:2: zipWith (+) fibonacci (tail fibonacci).

Чтобы соединить две бесконечные возрастающие последовательности в одну, воспользуемся алгоритмом слияния списков, модифицированным таким образом, чтобы в результирующую последовательность не попадали одинаковые элементы:

merge: [Integer] -> [Integer] -> [Integer].

merge sl6(xl:tl) s20(x2:t2) | xl < x2 = xl: merge tl s2.

I xl > x2 = x2: merge si t2.

| otherwise = xl: merge tl t2.

Теперь выражение для искомой последовательности будет выглядеть следующим образом:

merge power2 fibonacci.

Текст программы для решения поставленной задачи приведен в листинге 7.2.

Листинг 7.2. Бесконечная последовательность чисел Фибоначчи и степеней двойки.

fibAndPower2: [Integer].

fibAndPower2 = merge power2 fibonacci where power2 = iterate (*2) 1.

fibonacci = l:2:zipWith (+) fibonacci (tail fibonacci).

merge sl@(xl:tl) s20(x2:t2) | xl < x2 = xl: merge tl s2.

I xl > x2 = x2: merge si t2.

I otherwise = xl: merge tl t2.

Заметим, что в результирующей последовательности не так уж много чисел, которые являются одновременно числами Фибоначчи и степенями двойки. Легко находятся первые три таких числа: 1, 2 и 8, однако, попытка найти четвертое приводит к переполнению памяти.

Задача 7.2. Постройте бесконечную числовую матрицу, в которой все натуральные числа расположены «в диагональном» порядке так, как показано ниже:

  • 1 2 4 711…
  • 3 5 8 12.. .
  • 6 9 13 …
  • 10 14 …
  • 15 …

Решение. Заметим, что каждую следующую строку матрицы можно получить из предыдущей, если отбросить первый элемент строки и прибавить единицу ко всем оставшимся. Таким образом, если обозначить первую строку матрицы идентификатором rowl, то выражение для всей матрицы может быть получено следующим образом: iterate (map (+l).tail) rowl.

Первая строка получается, если взять первое число строки — единицу и последовательно добавлять числа натурального ряда: 1, 2, 3 и т. д. Тогда все выражение для искомой матрицы можно записать следующим образом: diagMatrix: Matrix.

diagMatrix = iterate (map (+ l).tail) rowl where rowl = scanl (+) 1 [1.].

Можно посмотреть, действительно ли выдаются правильные результаты в первых нескольких сроках и столбцах получившейся матрицы. Запросим, например, элементы первых четырех строк и столбцов:

" take 4 $ map (take 4) diagMatrix.

[[ 1,2,4,7], [3,5,8,12], [6,9,13,18], [10,14,19,25]].

Получен ожидаемый результат. Конечно, для того чтобы извлечь элемент матрицы с большими индексами строки и столбца, потребуется построить все предыдущие элементы матрицы, так что извлечение, например, элемента с индексами порядка 1000 потребует значительного времени работы и ресурсов памяти:

" diagMatrix ! ! 1000 ! ! 1000.

  • 2 002 001
  • (0.20 secs, 69 431 080 bytes)

Задача 7.3. Напишите функцию для транспонирования матрицы со строками бесконечной длины. Самих строк тоже может быть бесконечно много.

Решение. Поскольку строки — бесконечные, то не возникает вопроса о прямоуголыюсти матрицы. В получившемся результате должно быть бесконечное число строк, а число элементов в каждой строке (число столбцов) будет соответствовать числу строк в исходной матрице. Возможно, каждая строка также будет иметь бесконечное число элементов, если в исходной матрице было бесконечное число строк.

Понятно, как получить первую строку искомой матрицы: нужно составить список из первых элементов каждой строки исходной матрицы: firstRow = map head matrix.

Далее можно действовать по индукции: если отбросить первые элементы каждой строки и транспонировать получившуюся матрицу, то, прибавив к результату первую строку, получим искомый результат. Отсюда сразу получается программа, приведенная в листинге 7.3.

Листинг 7.3. Транспонирование бесконечной матрицы type Matrix, а = [ [а] ].

transpose: Matrix, а -> Matrix а.

transpose m = map head m: transpose (map tail m).

Если транспонировать матрицу diagMatrix, построенную нами в предыдущей задаче, то точно так же можно вывести первые несколько элементов транспонированной матрицы:

" take 4 $ map (take 4) $ transpose diagMatrix.

[[1,3,6,10], [2,5,9,14], [4,8,13,19], [7,12,18,25]]

Задача 7.4. Напишите функцию, которая по заданному вещественному х строит бесконечный список, элементами которого являются члены разложения функции sin х в ряд Тейлора в окрестности нуля.

Решение. Разложение синуса в ряд Тейлора в окрестности нуля имеет вид.

Примеры решения задач.

Для получения членов этого ряда нужно взять первый член этого ряда, а затем каждый следующий член получается, если предыдущий умножить на 2 и поделить на п (п — 1), где число п берется из последовательности нечетных натуральных чисел 3, 5,…

Таким образом, получается следующая функция для генерации бесконечного ряда членов разложения:

rowSin х = scanl (u n -> -u*x*x/(n-1)/n) x [3,5.].

Получающийся ряд должен приближать значение функции sin х с достаточной точностью для аргументов, близких к нулю. Например, для аргумента п/4 вычисления дают.

>> sin (pi/4).

  • 0.7 071 067 811 865 475 «sum $ take 5 $ row (pi/4.0)
  • 0.7 071 067 829 368 671

Восемь десятичных знаков получены точно, если просуммировать всего лишь пять членов полученного ряда.

Показать весь текст
Заполнить форму текущей работой