Методы в Java, Рекурсия
Методы в Java
1. Задание
Создать статический метод, который будет иметь два целочисленных параметра a и b, и в качестве своего значения возвращать случайное целое число из отрезка [a;b]. C помощью данного метода заполнить массив из 20 целых чисел и вывести его на экран.
public class one {
public static void pr(){
System.out.println();
}
public static int rand(int a, int b) {
return (int)(Math.random()*(b-a+1)+(a));
}
public static void main(String[] args) {
int[] mas = new int[20];
int a = 10, b = 15;
for(int i=0; i<mas.length; i++) {
mas[i] = rand(a, b);
System.out.print(mas[i]+" ");
}
pr();
}
}
2. Задание
Создать метод, который будет выводить указанный массив на экран в строку. С помощью созданного метода и метода из предыдущей задачи заполнить 5 массивов из 10 элементов каждый случайными числами и вывести все 5 массивов на экран, каждый на отдельной строке.
public class two {
public static void pr(){
System.out.println();
}
public static int rand(int a, int b) {
return (int)(Math.random()*(b-a+1)+(a));
}
public static void arr(int[] mas) {
for(int i=0; i<mas.length; i++) {
System.out.print(mas[i]+" ");
}
}
public static void main(String[] args) {
int[] mas1 = new int[10], mas2 = new int[10], mas3 = new int[10], mas4 = new int[10], mas5 = new int[10];
int a = 10, b = 15;
for(int i=0; i<mas1.length; i++) {
mas1[i] = rand(a, b);
}
arr(mas1);
pr();
for(int i=0; i<mas2.length; i++) {
mas2[i] = rand(a, b);
}
arr(mas2);
pr();
for(int i=0; i<mas3.length; i++) {
mas3[i] = rand(a, b);
}
arr(mas3);
pr();
for(int i=0; i<mas4.length; i++) {
mas4[i] = rand(a, b);
}
arr(mas4);
pr();
for(int i=0; i<mas5.length; i++) {
mas5[i] = rand(a, b);
}
arr(mas5);
pr();
}
}
3. Задание
Создать метод, который будет сортировать указанный массив по возрастанию любым известным вам способом.
public class three {
public static void pr(){
System.out.println();
}
public static int rand(int a, int b) {
return (int)(Math.random()*(b-a+1)+(a));
}
public static void arr(int[] mas) {
for(int i=0; i<mas.length; i++) {
System.out.print(mas[i]+" ");
}
}
public static void sort(int[] a) {
for (int i = a.length - 1; i >= 2; i--) {
boolean sorted = true;
for (int j = 0; j < i; j++) {
if (a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
sorted = false;
}
}
if(sorted) {
break;
}
}
}
public static void main(String[] args) {
int[] mas = new int[10];
int a = 10, b = 15;
for(int i=0; i<mas.length; i++) {
mas[i] = rand(a, b);
}
arr(mas);
sort(mas);
pr();
arr(mas);
}
}
4. Задание
В массиве хранится 7 явно заданных текстовых строк. Создать программу, которая отсортирует и выведет на экран строки в алфавитном порядке. Например, если были даны такие строки:
Пушкин
Лермонтов
Некрасов
Толстой Л. Н.
Толстой А. Н.
Есенин
Паустовский
Программа должна вывести на экран:
Есенин
Лермонтов
Некрасов
Паустовский
Пушкин
Толстой А. Н.
Толстой Л. Н.
Указание: прежде всего надо создать метод, устанавливающий отношения порядка для двух строк, переданных методу через аргументы.
public class four {
public static void pr(){
System.out.println();
}
public static void pr(String a){
System.out.println(a);
}
/*-----------Вывод массива на экран-----------*/
public static void arr(String[] mas) {
for(int i=0; i<mas.length; i++) {
System.out.println(mas[i]);
}
}
/*--------------------------------------------*/
/*------------------------------SORT(Сортировка)------------------------------------------*/
public static void sort(String[] a) {
for (int i = a.length - 1; i >= 2; i--) {
boolean sorted = true;
for (int j = 0; j < i; j++) {
if (compare(a[j], a[j+1])>0) {//Используем функцию compare для сравнения двух слов
String temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
sorted = false;
}
}
if(sorted) {
break;
}
}
}
/*------------------------------COMPARE(Сравнение)------------------------------------------*/
public static int compare(String word1, String word2) {
word1 = word1.toLowerCase();//Переводим в нижний регистр
word2 = word2.toLowerCase();//Переводим в нижний регистр
//Задаем массивы, где будут храниться буквы слов
int[] mas1 = new int[word1.length()];
int[] mas2 = new int[word2.length()];
//Заполняем массивы буквами (точнее порядковыми номерами этих букв)
for(int i=0; i<mas1.length; i++) {
char b = word1.charAt(i);//Цепляем из строки букву с порядковым номером i и сохраняем ее в переменную b
int k = (int)b;//Берем порядковый номер этой буквы
mas1[i] = k;//Записываем этот порядковый номер в массив
}
//Аналогично, только для другого слова
for(int i=0; i<mas2.length; i++) {
char b = word2.charAt(i);
int k = (int)b;
mas2[i] = k;
}
int i = 0, bool = 0;
//Пропускаем все одинаковые буквы в слове, они нас не интересуют, пока не попадутся не равные
while(mas1[i]==mas2[i]) {
i++;
if(i>=mas1.length||i>=mas2.length) {//Счетчик уже больше границ одного из массива, все остальное равно => сравниваем уже длину слова
if(mas1.length==mas2.length) {
break;//Строки равны
} else if(mas1.length<mas2.length) {
bool = -1;//Строка mas1 лежит выше по алфавиту, чем строка mas2
break;
} else {
bool = 1;//Строка mas1 лежит ниже по алфавиту, чем строка mas2
break;
}
}
}
if(mas1.length>1&&mas2.length>1) {//Описываем, что делать программе, если строки состоят более, чем из одной буквы
//Напомню, что мы уже исключили равные буквы, поэтому нам достаточно
//сравнить только эти две неравные буквы, если буква 1-го слова больше буквы 2-го слова, то 1-е слово лежит ниже второго
if(mas1[i]>mas2[i]) {
bool = 1;
//Аналогично, только тут идет проверка на то, лежит ли 1-е слово выше по алфавиту
} else if(mas1[i]<mas2[i]) {
bool = -1;
}
} else {
//Остался вариант, когда слова представляют из себя буквы, тогда просто сравниваем нулевые элементы массивов
//оба эти массива состаят из одного элемента с индексом 0
//Ниже по алфавиту
if(mas1[0]>mas2[0]) {
bool = 1;
//Выше по алфавиту
}else if(mas1[0]<mas2[0]) {
bool = -1;
}
}
return bool;//Возвращаем значение переменной bool. Если значение отрицательное, то первое слово
//лежит выше по алфавиту, чем второе. Если значение положительное, то ситуация обратна: первое
//слово лежит ниже по алфавиту, чем второе. Если 0, то эти слова равны
}
/*-------------------------------------------------------------------------------*/
public static void main(String[] args) {
//Задаем исходный массив
String[] a = {"Pushkin", "Lermontov", "Nekrasov", "Tolstoj L. N.", "Tolstoj A. N.", "Esenin", "Paystovskij","a","Av"};
sort(a);//Сортируем массив
arr(a);//Выводим массив на экран
pr();//Переводим на другую строку
}
}
Рекурсия
1-3. Задания
- Выясните экспериментальном путём, начиная с какого элемента последовательности Фибоначчи, вычисление с использованием рекурсии становится неприемлемым (занимает более минуты по времени).
- Создайте гибридный метод, для небольших n вычисляющий n-ое число Фибоначчи с помощью рекурсии, а для значений, превышающих выясненное вами в предыдущей задаче пороговое n, вычисляющий n-ое число Фибоначчи с помощью итерационного алгоритма (цикла, в рамках которого будут сохраняться значения двух предыдущих элементов последовательности).
- Подсчитайте, сколько раз потребуется повторно вычислить четвёртый элементы последовательности Фибоначчи для вычисления пятнадцатого элемента.
public class one {
public static void ln(String a) {
System.out.println(a);
}
static long fib (int n) {
if (n==1 || n == 2) {
return 1;
}
return fib (n-2) + fib (n-1);
}
static long fibo(int n) {
//lim(fib(n)) = 47
if(n < 47) {
long z = fib(n);
return z;
} else {
long n1 = 1,n2 = 1,s=0;
for(int i = 0; i<n; i++){
if(i%2==0) {
s = n1+n2;
n1 = s;
} else {
s = n1+n2;
n2 = s;
}
}
return s;
}
}
public static void main(String[] args) {
int f = 15;
long d = fibo(f);
f = 4;
long d1 = fibo(f);
int k = (int)(d/d1);
ln("Zadanije 1: Na 48 nomere secundomer pokazal 1:00.76 (1 minuta 0.76 sekund)");
System.out.println("Zadanije 2: "+fibo(100));
System.out.println("Zadanije 3: "+k+" raz");
}
}
|
|