Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


unsigned long factorial(unsigned int n)



{

if (n < = 1)

Return 1; // выход из рекурсии – терминальная ветвь

else return n * factorial(n-1);

}

4. Компиляция, отладка, тестирование и получение результата:

 

Задание 2.

Написать рекурсивную функцию, определяющую количество положительных элементов в заданном векторе vectorn.

1. Представим решение этой сложной задачи через решение более простой задачи посредством рекурсивного обращения. Чтобы подсчитать количество нужных нам элементов во всем векторе, содержащем n элементов, необходимо сначала сделать это для вектора, содержащего n–1 элемент, n-2 элемента, и так далее. Затем остается выполнить проверку последнего элемента, и добавить к результату единицу в том случае, если он окажется положительным.

2. Схема алгоритма решения задачи:

 

 

3. Код программы

 

3.1. На языке Паскаль:

 

Program Variant_0;

Uses WinCrt;

Const n = 10; {задание размера вектора именованной константой}

Type TVect=Array [1..n] Of Integer; {описание нового типа}

Var i, count: Word;

v_min, v_max: Integer;

vector: TVect;

Function Count_pol(k: Word; Var AA: TVect): Word;

Var m: Word;

Begin

If (k=0)

Then m: =0 {если в векторе уже нет элементов}

Else

Begin

m: =Count_pol(k-1, AA);

If (AA[k]> 0)

Then m: =m+1;

End;

Count_pol: =m;

End; {функции Count_pol}

Begin {головная программа}

Randomize; {запуск генератора случайных чисел}

WriteLn('Лабораторная работа №9_2');

WriteLn('Вариант №0');

WriteLn('ИС-11-1');

WriteLn('Пупкин Василий');

WriteLn;

WriteLn('Задайте диапазон случайных чисел');

Write('v_min=');

ReadLn(v_min);

Write('v_max=');

ReadLn(v_max);

For i: =1 To n Do {заполнение вектора случайными числами}

vector[i]: =Random(v_max-v_min + 1) + v_min;

WriteLn;

WriteLn('Исходный вектор: ');

For i: =1 To n Do {вывод на экран исходного вектора}

Write(vector[i]: 5);

WriteLn;

count: =Count_pol(n, vector);

WriteLn;

WriteLn('count=', count);

End.

3.2. На языке Си:

#include < stdio.h>

#include < conio.h>

#include < math.h>

#include < time.h>

// прототипы функций

void vorm_vector(int nn, int vect_max, int vect_min, int vect[nn]);

int count_pol(int nn, int vect[nn]);

Int main()

{

int i, n, vector_min, vector_max, count;

printf(" \nЛабораторная работа №9_2" );

printf(" \nВариант №0" );

printf(" \nПО-11-1" );

printf(" \nПупкин Василий\n" );

printf(" \nВведите нижнюю границу диапазона: " );

scanf(" %d", & vector_min);

printf(" \nВведите верхнюю границу диапазона: " );

scanf(" %d", & vector_max);

printf(" \nВведите размер вектора: " );

scanf(" %d", & n);

int vector[n];

printf(" \nИсходный вектор: \n" );

vorm_vector(n, vector_max, vector_min, vector);

for (i=0; i< n; i++)

printf(" %5d", vector[i]);

printf(" \n" );

count = count_pol(n, vector);

printf(" \nКоличество положительных элементов в векторе %d\n", count);

return 0;

}

//описание функций

// 1. формирование вектора

void vorm_vector(int nn, int vect_max, int vect_min, int vect[nn])

{

int i, m;

time_t t; // текущее время для инициализации

// генератора случайных чисел

srand((unsigned) time(& t)); // инициализация генератора

// случайных чисел

m = vect_max-vect_min + 1;

// получение случайного числа в диапазоне

// от vector_min до vector_max

for (i=0; i< nn; i++)

vect[i]=rand()% m + vect_min;

}

// 2. рекурсивное определение количества положительных элементов в векторе

int count_pol(int nn, int vect[nn])

{

int m;

if (nn == 0)

m = 0; //в векторе уже нет элементов - терминальная ветвь

Else

{

m = count_pol(nn-1, vect);

if (vect[nn] > 0)

m++;

}

return m;

}

 

4. Компиляция, отладка, тестирование и получение результата:

 

 

Задания на лабораторную работу №9

Исходные данные (значения переменных и строк) вводить с консоли. Размеры исходных векторов задавать именованными константами. Для задания элементов исходных векторов использовать генератор случайных чисел с заданным с консоли диапазоном от v_min до v_max. Вывести на экран исходные и выходные векторы. Никакие другие массивы (рабочие) кроме исходных и выходных, не использовать.

Внутри рекурсивных функций и процедур использовать циклы запрещается.

 

Вариант 1

Задание 1

Написать функцию для вычисления суммы цифр натурального числа n.

Задание 2

Написать функцию для вычисления максимального элемента заданного вектора vectorn.

 

Вариант 2

Задание 1

Написать функцию для вычисления количества цифр натурального числа n.

Задание 2

Написать функцию для вычисления суммы элементов заданного вектора vectorn.

 

Вариант 3

Задание 1

Написать функцию для вычисления цифрового корня натурального числа n.

Задание 2

Написать функцию для вычисления индекса максимального элемента заданного вектора vectorn.

Вариант 4

Задание 1

Задан первый член и разность арифметической прогрессии. Написать функция для нахождения n-го члена прогрессии.

Задание 2

Написать функцию, переводящую целое положительное число x из десятичной в двоичную систему счисления.

Вариант 5

Задание 1

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

Задание 2

Последовательность полиномов Лагерра определяется следующим образом:

L0(x) = 1,

L1(x) = x – 1,

Lk(x) = (x – 2k + 1)Lk-1(x) + (k-1)2Lk-2(x)

Написать функцию для вычисления n-го полинома Лагерра для заданного x.

Вариант 6

Задание 1

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

Задание 2

Написать функция для вычисления значения полинома Эрмита для заданных x и n> 1:

H0(x) = 1,

H1(x) = 2x,

Hn(x) = 2xHn-1(x) – 2(n-1)Hn-2(x)

Вариант 7

Задание 1

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

Задание 2

Написать функция для возведения вещественного x (x#0) в целую степень n:

 

xn = 1, если n=0,

xn = 1/x|n|, если n< 0,

xn = x•xn-1, если n> 0.

Вариант 8

Задание 1

Написать функцию для вычисления значения функции Аккермана для неотрицательных n и m:

A(n, m) = m + 1, если n=0,

A(n, m) = A(n-1, 1), если m=0, n#0,

A(n, m) = A(n-1, A(n, m – 1)), если m> 0, n> 0,

Например, для n=1, m=2:

A(1, 2) = 4

Задание 2

Написать функцию для вывода на экран всех перестановок n различных натуральных чисел (n≤ 5).

Вариант 9

Задание 1

Написать функцию для перестановки цифр натурального числа n в обратном порядке.

Задание 2

Написать функцию, вычисляющую сумму n корней вида:

Вариант 10

Задание 1

Написать процедуру для ввода с консоли последовательности чисел (конец последовательности – цифра ноль) и вывода ее на экран в обратном порядке. Массивы, строки, файлы, очереди, стеки, деревья не использовать.

Задание 2

Написать функцию, вычисляющую сумму n корней вида:

Вариант 11

Задание 1

Написать функцию для вычисления значения функции Маккарти для неотрицательного n:

M(n) = n - 10, если n> 100,

M(n) = M(M(n + 11)), если n< =100

Задание 2

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

Вариант 12

Задание 1

Написать функцию для вычисления значения функции Кадью для неотрицательных x, y, z:

K(x, y, z) = z, если x = y,

K(x, y, z) = K(x, y+1, (y+1)z), если x#y

Задание 2

Написать функцию, переводящую целое положительное число x из десятичной в восьмеричную систему счисления.

Вариант 13

Задание 1

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

Задание 2

Написать функцию, переводящую целое положительное число x из десятичной в 16-ричную систему счисления.

Вариант 14

Задание 1

Написать функцию для вычисления числа сочетаний из n по m:

Cn0 = Cnn = 1,

Cnm = Cn-1m + Cn-1m-1, 0≤ m≤ n

Задание 2

Написать функцию, вычисляющую сумму n вложений вида:

s = cos(1+sin(2+cos(3+sin(4+cos(5+ …)…))

 

Вариант 15

Задание 1

Задано целое положительное число x длиной не более 20 цифр. Написать функцию, расставляющую между некоторыми его цифрами знаки сложения и вычитания так, чтобы полученное выражение равнялось заданному n:

x = 123456789

n = 171

12 + 34 + 56 + 78 - 9 = 171

Задание 2

Написать функцию, определяющую, является ли заданная строка палиндромом.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-11; Просмотров: 630; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.054 с.)
Главная | Случайная страница | Обратная связь