Основы программирования (Java). Методы. Рекурсия

Содержание

Слайд 2

Вычисление факториала public class Main1 { public static long fuct(int n)

Вычисление факториала

public class Main1 {
public static long fuct(int n) {
long res

= 1;
for(int i = 1; i <= n; i++) {
res *= i;
}
return res;
}
public static void main(String[] args) {
int n = 4;
long f = fuct(n);
System.out.println(n + "! = " + f);
}
}
Слайд 3

Вычисление факториала - рекурсия public class Main1 { private static long

Вычисление факториала - рекурсия

public class Main1 {
private static long fuct2(int n)

{
if (n == 0) {
return 1;
}
long res = fuct2(n - 1) * n;
return res;
}
public static void main(String[] args) {
int n = 4;
long f = fuct2(n);
System.out.println(n + "! = " + f);
}
}
Слайд 4

Трассировка Трассировка итерационной реализации Трассировка рекурсивной реализации 3) Ручная трассировка итерации 4) Ручная трассировка рекурсии

Трассировка

Трассировка итерационной реализации
Трассировка рекурсивной реализации
3) Ручная трассировка итерации
4) Ручная трассировка рекурсии

Слайд 5

Рекурсия – загадка 1 public class Main2 { public static void

Рекурсия – загадка 1

public class Main2 {
public static void main(String[] args)

{
rec1(3);
}
public static void rec1(int n) {
System.out.print(" " + n);
if (n > 1) {
rec1(n - 1);
}
}
}

Что будет выведено?

Слайд 6

Рекурсия – загадка 2 public class Main2 { public static void

Рекурсия – загадка 2

public class Main2 {
public static void main(String[] args)

{
rec1(3);
}
public static void rec1(int n) {
if (n > 1) {
rec1(n - 1);
}
System.out.print(" " + n);
}
}

Что будет выведено?

Слайд 7

Рекурсия – загадка 3 public class Main2 { public static void

Рекурсия – загадка 3

public class Main2 {
public static void main(String[] args)

{
rec1(3);
}
public static void rec1(int n) {
System.out.print(" " + n);
if (n > 1) {
rec1(n - 1);
}
System.out.print(" " + n);
}
}

Что будет выведено?

Слайд 8

Рекурсия – загадка 4 public class Main2 { public static void

Рекурсия – загадка 4

public class Main2 {
public static void main(String[] args)

{
rec2(4);
}
public static void rec2(int n) {
if (n >= 1) {
System.out.print(" " + n);
rec2(n - 1);
}
}
}

Что будет выведено?

Слайд 9

Рекурсия – загадка 5 public class Main2 { public static void

Рекурсия – загадка 5

public class Main2 {
public static void main(String[] args)

{
rec2(3);
}
public static void rec2(int n) {
if (n >= 1) {
System.out.print(" " + n);
rec2(n - 1);
rec2(n - 1);
}
}
}

Что будет выведено?

Слайд 10

Рекурсия – загадка 6 public class Main2 { public static void

Рекурсия – загадка 6

public class Main2 {
public static void main(String[] args)

{
rec2(3);
}
public static void rec2(int n) {
if (n >= 1) {
System.out.print(" " + n);
rec2(n - 1);
rec2(n - 1);
System.out.print(" " + n);
}
}
}

Что будет выведено?

Слайд 11

Рекурсия – загадка 7 (ЕГЭ 2017 Демо) public class Main2 {

Рекурсия – загадка 7 (ЕГЭ 2017 Демо)
public class Main2 {
public static

void main(String[] args) {
F(10);
}
static void F(int n) {
if (n > 2) {
System.out.printf("%d\n", n);
F(n - 3);
F(n - 4);
}
}
}

Задача 11: Чему равна сумма напечатанных на экране чисел при выполнении вызова F(10)?

Слайд 12

Рекурсия – загадка 8 (ЕГЭ 2015 Демо) public class Main2 {

Рекурсия – загадка 8 (ЕГЭ 2015 Демо)

public class Main2 {
public static

void main(String[] args) {
F(1);
}
static void F(int n)
{
System.out.printf("%d\n", n);
if (n < 5) {
F(n + 1);
F(n + 3);
}
}
}

Задача 11: Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(1)?

Слайд 13

Рекурсия – загадка 9 (ЕГЭ 2016 Демо) public class Main2 {

Рекурсия – загадка 9 (ЕГЭ 2016 Демо)

public class Main2 {
public static

void main(String[] args) {
F(11);
}
static void F(int n){
if (n > 0)
G(n - 1);
}
static void G(int n){
System.out.printf("*");
if (n > 1)
F(n - 3);
}
}

Задача 11: записаны две рекурсивные функции : F и G. Сколько символов «звёздочка» будет напечатано на экране при выполнении вызова F(11)?

Слайд 14

Вычисление чисел Фибоначчи public class Main3 { public static void main(String[]

Вычисление чисел Фибоначчи

public class Main3 {
public static void main(String[] args)

{
System.out.println(fib(6));
}
public static int fib(int n) {
if (n <= 2) {
return 1;
} else {
int s = 0;
int f1 = 1;
int f2 = 1;
for(int i = 2; i < n; i++) {
s = f1 + f2;
f1 = f2;
f2 = s;
}
return s;
}
}
}
Слайд 15

Вычисление чисел Фибоначчи (рекурсия) public class Main3 { public static void

Вычисление чисел Фибоначчи (рекурсия)

public class Main3 {
public static void main(String[]

args) {
System.out.println(fib2(6));
}
public static int fib2(int n) {
if (n <= 2) {
return 1;
} else {
return fib2(n - 1) + fib2(n - 2);
}
}
}
Слайд 16

Метод для рисования треугольника Создать приложение, в котором на панели рисуется 1 треугольник

Метод для рисования треугольника

Создать приложение, в котором на панели рисуется 1

треугольник
Слайд 17

Метод для рисования треугольника (код) public class MyPanel3 extends JPanel {

Метод для рисования треугольника (код)

public class MyPanel3 extends JPanel {
private void

drawTriangle(Graphics g,
int cx, int cy, int size) {
int x1 = cx;
int y1 = cy - size;
int x2 = cx - size;
int y2 = cy + size;
int x3 = cx + size;
int y3 = cy + size;
g.setColor(Color.RED);
g.drawLine(x1, y1, x2, y2);
g.drawLine(x2, y2, x3, y3);
g.drawLine(x3, y3, x1, y1);
}
@Override
public void paint(Graphics g) {
super.paint(g);
drawTriangle(g, 100, 100, 50);
}
}
Слайд 18

Рекурсивный метод для рисования треугольника Создать приложение, в котором на панели рисуется рекурсивный треугольник

Рекурсивный метод для рисования треугольника

Создать приложение, в котором на панели рисуется

рекурсивный треугольник
Слайд 19

Код рекурсивного метода public class MyPanel3 extends JPanel { ... private

Код рекурсивного метода

public class MyPanel3 extends JPanel {
...
private void triangleRec(Graphics g,


int cx, int cy, int size) {
drawTriangle(g, cx, cy, size);
if (size < 4) {
return;
}
triangleRec(g, cx, cy - size, size / 2);
}
@Override
public void paint(Graphics g) {
super.paint(g);
triangleRec(g, 100, 100, 50);
}
}
Слайд 20

Рекурсивный метод для рисования треугольника Создать приложение, в котором на панели рисуется рекурсивный треугольник

Рекурсивный метод для рисования треугольника

Создать приложение, в котором на панели рисуется

рекурсивный треугольник
Слайд 21

Код рекурсивного метода public class MyPanel3 extends JPanel { ... private

Код рекурсивного метода

public class MyPanel3 extends JPanel {
...
private void triangleRec(Graphics g,


int cx, int cy, int size) {
drawTriangle(g, cx, cy, size);
if (size < 4) {
return;
}
triangleRec(g, cx, cy - size, size / 2);
triangleRec(g, cx - size, cy + size, size / 2);
triangleRec(g, cx + size, cy + size, size / 2);
}
@Override
public void paint(Graphics g) {
super.paint(g);
triangleRec(g, 100, 100, 50);
}
}
Слайд 22

Метод для рисования квадрата Создать приложение, в котором на панели рисуется 1 квадрат

Метод для рисования квадрата

Создать приложение, в котором на панели рисуется 1

квадрат
Слайд 23

Метод для рисования квадрата (код) public class MyPanel3 extends JPanel {

Метод для рисования квадрата (код)

public class MyPanel3 extends JPanel {
private static

void drawSquare(Graphics g,
int cx, int cy, int size){
int x1 = cx - size;
int y1 = cy - size;
int width = size * 2;
int height = size * 2;
g.setColor(Color.BLUE);
g.drawRect(x1, y1, width, height);
}
@Override
public void paint(Graphics g) {
super.paint(g);
drawSquare(g, 100, 100, 50);
}
}
Слайд 24

Рекурсивный метод для рисования квадрата Создать приложение, в котором на панели рисуется рекурсивный квадрат

Рекурсивный метод для рисования квадрата

Создать приложение, в котором на панели рисуется

рекурсивный квадрат
Слайд 25

Метод для рисования квадрата (код) public class MyPanel3 extends JPanel {

Метод для рисования квадрата (код)

public class MyPanel3 extends JPanel {
...
private void

squareRec(Graphics g,
int cx, int cy, int size) {
drawSquare(g, cx, cy, size);
if (size < 4) {
return;
}
squareRec(g, cx, cy - size, size / 2);
}
@Override
public void paint(Graphics g) {
super.paint(g);
squareRec(g, 100, 100, 50);
}
}
Слайд 26

Рекурсивный метод для рисования квадрата Создать приложение, в котором на панели рисуется рекурсивный квадрат

Рекурсивный метод для рисования квадрата

Создать приложение, в котором на панели рисуется

рекурсивный квадрат
Слайд 27

Метод для рисования квадрата (код) public class MyPanel3 extends JPanel {

Метод для рисования квадрата (код)

public class MyPanel3 extends JPanel {
...
private void

squareRec(Graphics g,
int cx, int cy, int size) {
drawSquare(g, cx, cy, size);
if (size < 4) {
return;
}
squareRec(g, cx, cy - size, size / 2);
squareRec(g, cx, cy + size, size / 2);
squareRec(g, cx - size, cy, size / 2);
squareRec(g, cx + size, cy, size / 2);
}
@Override
public void paint(Graphics g) {
super.paint(g);
squareRec(g, 100, 100, 50);
}
}
Слайд 28

Рекурсивный метод для рисования квадрата Создать приложение, в котором на панели рисуется рекурсивный квадрат

Рекурсивный метод для рисования квадрата

Создать приложение, в котором на панели рисуется

рекурсивный квадрат
Слайд 29

Метод для рисования квадрата (код) public class MyPanel3 extends JPanel {

Метод для рисования квадрата (код)

public class MyPanel3 extends JPanel {
...
private void

squareRec(Graphics g,
int cx, int cy, int size) {
drawSquare(g, cx, cy, size);
if (size < 10) {
return;
}
squareRec(g, cx, cy - size, size / 2);
squareRec(g, cx, cy + size, size / 2);
squareRec(g, cx - size, cy, size / 2);
squareRec(g, cx + size, cy, size / 2);
}
@Override
public void paint(Graphics g) {
super.paint(g);
squareRec(g, 100, 100, 50);
}
}
Слайд 30

Косвенная рекурсия Создать приложение, в котором на панели рисуется рекурсивный квадрат,

Косвенная рекурсия

Создать приложение, в котором на панели рисуется рекурсивный квадрат, созданный

из рекурсивных треугольников, которые созданы из квадратов и т.д.
Слайд 31

Код private void triangleRec2(Graphics g, int cx, int cy, int size)

Код

private void triangleRec2(Graphics g,
int cx, int cy, int size) {
drawTriangle(g,

cx, cy, size);
if (size < 4) {
return;
}
squareRec2(g, cx, cy - size, size / 2);
squareRec2(g, cx - size, cy + size, size / 2);
squareRec2(g, cx + size, cy + size, size / 2);
}
private void squareRec2(Graphics g,
int cx, int cy, int size) {
drawSquare(g, cx, cy, size);
if (size < 10) {
return;
}
triangleRec2(g, cx, cy - size, size / 2);
triangleRec2(g, cx, cy + size, size / 2);
triangleRec2(g, cx - size, cy, size / 2);
triangleRec2(g, cx + size, cy, size / 2);
}
Слайд 32

Косвенная рекурсия (примеры)

Косвенная рекурсия (примеры)