Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8

Решение задач с использованием рекурсии

01.08.2015, 06:55. Показов 10253. Ответов 120
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Когда я обратился к поисковой системе, то я не нашёл
ни одного упоминания о рекурсии. Испытав шок, я
решил создать эту тему на QBasic. (В паскале о рекурсии
говорят на каждом углу). Приведу нестандартный пример
рекурсии:
Посадил дед репку. И выросла она большая-пребольшая.
(Далее вызывается рекурсивная процедура)
Тянет дед репку, потянет, вытащить не может.
(Условием выхода из этой процедуры будет событие
при котором репка будет вытащена)
Эта процедура вызывает сама себя и на помощь деду
приходит бабка. И тд. После шестого вызова процедуры
на арене появляется мышка. Благодаря которой репку
вытаскивают. Условие окончания процедуры соблюдено
и программа (как и сказка) завершается.
Что надо знать при написании рекурсивных программ.
1. Оператор CLEAR, , 29000
Этот оператор задаёт величину стека. В данном примере
приведена цифра 29000 - это максимальная величина
стека для QBasic v1.0 -1.1. Для QuickBasic стек ещё больше.
2. Функция FRE(-2) ; (PRINT FRE(-2))
Эта функция указывает (в байтах) свободное стековое
пространство.
3. Функция DEF FN... - эта функция не поддерживает
рекурсии.
4. Рекурсию поддерживают
1) FUNCTION - END FUNCTION
2) SUB - END SUB
3) GOSUB - RETURN
Последним правда не слишком удобно пользоваться, но
пару примеров я приведу (именно на GOSUB - RETURN)

Эта программа вычисляет сумму n натуральных чисел

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CLS
CLEAR, , 20000
INPUT "N = "; N
 
GOSUB RECURSIA
PRINT Sum
END
 
RECURSIA:
IF n > 0 THEN
   Sum = Sum +n
   n = n - 1
   GOSUB RECURSIA
END IF
RETURN
Добавлено через 10 часов 46 минут
Это программа вычисляет числа Фибоначи

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DECLARE FUNCTION SSTR(n!)
CLS
DEFLNG F
CLEAR, , 10000
 
INPUT "N = "; n
m = n
f1 = 1: f2 = 1: fi = 1
 
GOSUB RECURSIA
 
PRINT " fi(" + SSTR(m) + ") ="; fi
END
 
RECURSIA:
IF n = 1 OR n = 2 THEN
   RETURN
ELSE
   fi = f1 + f2
   f1 = f2
   f2 = fi
   n = n - 1
   GOSUB RECURSIA
END IF
RETURN
 
FUNCTION SSTR(n)
   SSTR = LTRIM$(STR$(n))
END FUNCTION
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2015, 06:55
Ответы с готовыми решениями:

решение задач с использованием рекурсии
Ув Форумчане подскажите пожалуйста либо ресурс где это можно прочитать мне нужно эту тему расписать помогите пожалуйста :)

Решение задач по обработке информации с включением рекурсии
кто знает как делать? или как должно выглядеть хоть? "Решение задач по обработке информации с включением рекурсии" если кто знает...

Решение задач с применением операции рекурсии к функциям
Добрый день! Помогите написать небольшую процедуру применения операции примитивной рекурсии к функциям g(x) , h(x,y,z) и по переменной...

120
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
11.12.2015, 10:53  [ТС]
Студворк — интернет-сервис помощи студентам
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
REM  Вписанные прямоугольники
 
DECLARE SUB tr (xa!, ya!, xb!, yb!, xc!, yc!, xd!, yd!, n!)
CLS
 
SCREEN 11
WINDOW (0, 300)-(400, 0)
n = 9
 
CALL tr(100, 50, 50, 50, 600, 50, 50, 450, n)
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB tr (xa, ya, xb, yb, xc, yc, xd, yd, n)
 
IF n > 0 THEN
 
   x1 = (xa + xb) / 2
   y1 = (ya + yb) / 2
 
   x2 = (xb + xc) / 2
   y2 = (yb + yc) / 2
 
   x3 = (xc + xd) / 2
   y3 = (yc + yd) / 2
 
   x4 = (xa + xd) / 2
   y4 = (ya + yd) / 2
 
   LINE (x1, y1)-(x2, y2)
   LINE (x2, y2)-(x3, y3)
 
   LINE (x3, y3)-(x4, y4)
   LINE (x4, y4)-(x1, y1)
 
   CALL tr(x1, y1, x2, y2, x3, y3, x4, y4, n - 1)
END IF
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
12.12.2015, 15:55  [ТС]
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
REM  Пирамиды
 
DECLARE SUB Ris (x1!, y1!, x2!, y2!, x3!, y3!, x4!, y4!)
CLS
CONST k = .7
 
SCREEN 11
WINDOW SCREEN (400, 0)-(0, 300)
 
CALL Ris(380, 280, 280, 280, 330, 150, 240, 240)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB Ris (x1, y1, x2, y2, x3, y3, x4, y4)
 
    IF x1 - x2 < 10 THEN EXIT SUB
 
    LINE (x1, y1)-(x2, y2)
    LINE (x2, y2)-(x3, y3)
    LINE (x3, y3)-(x1, y1)
    LINE (x3, y3)-(x4, y4)
    LINE (x4, y4)-(x2, y2)
 
    x1 = k * x1: y1 = k * y1
    x2 = k * x2: y2 = k * y2
    x3 = k * x3: y3 = k * y3
    x4 = k * x4: y4 = k * y4
 
    CALL Ris(x1, y1, x2, y2, x3, y3, x4, y4)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
14.12.2015, 17:01  [ТС]
Посмотрите на нестандартное применение
оператора WINDOW.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
REM Рекурсия
 
DECLARE SUB Pic (x1, y1, x2, y2, x3, y3, x4, y4, n!)
CLS
 
CONST a = 30
SCREEN 11
 
FOR i = 0 TO 14
   WINDOW (-280 * (1 + i), 210 * (1 + i))-(280 * (1 + i), -210 * (1 + i))
   CALL Pic(30, 150, -30, 150, 60, 104, -60, 104, 0)
NEXT i
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB Pic (x1, y1, x2, y2, x3, y3, x4, y4, n)
   IF n = 6 THEN EXIT SUB
 
   LINE (x1, y1)-(x2, y2)
   LINE (x1, y1)-(x3, y3)
   LINE (x2, y2)-(x4, y4)
 
   x11 = x1 * .5 - y1 * .866
   y11 = y1 * .5 + x1 * .866
   x22 = x2 * .5 - y2 * .866
   y22 = y2 * .5 + x2 * .866
   x33 = x3 * .5 - y3 * .866
   y33 = y3 * .5 + x3 * .866
   x44 = x4 * .5 - y4 * .866
   y44 = y4 * .5 + x4 * .866
 
   CALL Pic(x11, y11, x22, y22, x33, y33, x44, y44, n + 1)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
15.12.2015, 11:17  [ТС]
Эта программа не просто обобщение одной из предыдущих
программ, где тоже вычисляются sin и cos, это совершенно
новый алгоритм, новое видение рекурсии. И новая ступень
к заветной цели ...

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
REM Вычисляется одновременно
REM       SIN(x)  и  COS(x)
REM    x - в градусах
 
DECLARE FUNCTION SSTR$ (x!)
DECLARE FUNCTION S! (x!)
DECLARE FUNCTION C! (x!)
 
CLS
CONST g = .01745329#
 
INPUT "X = "; x
z = g * x
 
PRINT "SIN(" + SSTR(x) + ") ="; S(z)
PRINT "COS(" + SSTR(x) + ") ="; C(z)
END
 
FUNCTION C (x)
   IF ABS(x) < .001 THEN
      C = 1 - .5 * x * x
   ELSE
      C = C(x / 2) ^ 2 - S(x / 2) ^ 2
   END IF
END FUNCTION
 
FUNCTION S (x)
   IF ABS(x) < .001 THEN
      S = x
   ELSE
      S = 2 * S(x / 2) * C(x / 2)
   END IF
END FUNCTION
 
FUNCTION SSTR$ (x)
   SSTR = LTRIM$(STR$(x))
END FUNCTION
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
15.12.2015, 14:58  [ТС]
Эта программа вычисляет обратную величину переменной Х
Вроде бы что может быть проще? Что тут вообще считать?
Здесь вы узнаете то, что никогда в жизни не знали ...
1. Выход их рекурсии - приближенная формула
1/x = 2 - x (при Х близком к 1)

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
REM
REM  1 / X
REM
 
DECLARE FUNCTION D! (x!)
CLS
 
CLEAR , , 20000
INPUT "X = "; x
 
PRINT "1/x ="; D(x)
END
 
FUNCTION D (x)
   IF x < 1.0001 THEN
      D = 2 - x
   ELSE
      D = D(SQR(x)) ^ 2
   END IF
END FUNCTION
Эта формула принесет вам счастье!
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
16.12.2015, 10:23  [ТС]
Вы можете усовершенствовать эту программу
Например добавить, чтобы x не могло равняться
90° + 180°N (N - целое число)

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
REM           y = tg(x)
REM  x задается в градусах
REM
 
DECLARE FUNCTION tg! (x!)
DECLARE FUNCTION SSTR$ (x!)
CLS
 
CONST g = .01745329#
INPUT "X = "; x
z = g * x
 
PRINT "tg(" + SSTR(x) + ") ="; tg(z)
END
 
FUNCTION SSTR$ (x)
   SSTR = LTRIM$(STR$(x))
END FUNCTION
 
FUNCTION tg (x)
   IF ABS(x) < .001 THEN
      tg = x
   ELSE
      t = tg(x / 2)
      tg = 2 * t / (1 - t ^ 2)
   END IF
END FUNCTION
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
16.12.2015, 15:36  [ТС]
Простая программа.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
REM
REM  СПИРАЛЬ
REM
 
DECLARE SUB Pic (x!, a!, b!, r!)
CLS
 
DIM SHARED d
d = 8
SCREEN 11
WINDOW (-200, 150)-(200, -150)
 
CALL Pic(0, 0, 3.1416, 10)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB Pic (x, a, b, r)
   IF r > 130 THEN EXIT SUB
 
   CIRCLE (x, 0), r, , a, b
 
   SWAP a, b
   d = -d
   CALL Pic(x - d, a, b, r + ABS(d))
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
17.12.2015, 16:01  [ТС]
Эта программа (мечта программиста) печатает все
перестановки из N нулей и единиц. Число единиц и
нулей не меняется (постоянно).

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
REM            RECURSION
REM  Это САМАЯ прекрасная программа.  
REM  Она печатает все перестановки из N нулей
REM  и единиц. (k единиц и N - k нулей).
REM
 
DECLARE SUB Y (n%, k%)
CLS
 
DIM n AS INTEGER
DIM k AS INTEGER
DIM SHARED m
n = 6: k = 3: m = n
 
DIM SHARED A(1 TO n) AS INTEGER
 
FOR i = 1 TO n
   IF i <= k THEN A(i) = 1
NEXT i
CALL Y(n, k)
END
 
SUB Y (n AS INTEGER, k AS INTEGER)
   IF k = 0 THEN
      FOR j = 1 TO m
         PRINT A(j);
      NEXT j: PRINT
   ELSE
      IF n > k THEN CALL Y(n - 1, k)
         SWAP A(k), A(n)
         CALL Y(n - 1, k - 1)
         SWAP A(k), A(n)
   END IF
END SUB
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
19.12.2015, 10:23  [ТС]
...
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
REM       Дано 10 рандомных чисел
REM  Требуется найти из них ровно 3 числа
REM  такие, чтобы их сумма была равна 77
REM
 
DECLARE SUB Y (n%, k%)
CLS
RANDOMIZE TIMER
 
DIM n AS INTEGER
DIM k AS INTEGER
DIM SHARED m
n = 10: k = 3: m = n
 
DIM SHARED A(1 TO n) AS INTEGER
DIM SHARED B(1 TO n) AS INTEGER
 
FOR i = 1 TO k
   A(i) = 1
NEXT i
 
FOR i = 1 TO n
   B(i) = 10 + 30 * RND
   PRINT B(i);
NEXT i: PRINT : PRINT
 
CALL Y(n, k)
END
 
SUB Y (n AS INTEGER, k AS INTEGER)
   IF k = 0 THEN
      S = 0
      FOR j = 1 TO m
         S = S + A(j) * B(j)
      NEXT j
      IF S = 77 THEN
         FOR p = 1 TO m
            IF A(p) THEN PRINT B(p);
         NEXT p: PRINT
      END IF
   ELSE
      IF n > k THEN CALL Y(n - 1, k)
         SWAP A(k), A(n)
         CALL Y(n - 1, k - 1)
         SWAP A(k), A(n)
   END IF
END SUB
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
21.12.2015, 14:11  [ТС]
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
REM   Вычисление Arctg(x)
REM   Рекурсивная формула
REM   arctg(x) = 2 * arctg((SQR(1 + x ^ 2) - 1) / x)
REM   arctg(x) = x  (при малом х)
 
DECLARE FUNCTION SSTR$ (x!)
DECLARE FUNCTION arctg! (x!)
CLS
 
INPUT "X = "; x
 
PRINT "arctg(" + SSTR(x) + ") ="; arctg(x)
END
 
FUNCTION arctg (x)
   IF ABS(x) < .001 THEN
      arctg = x
   ELSE
      arctg = 2 * arctg((SQR(1 + x ^ 2) - 1) / x)
   END IF
END FUNCTION
 
FUNCTION SSTR$ (x)
   SSTR = LTRIM$(STR$(x))
END FUNCTION
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.12.2015, 11:24  [ТС]
Этот фрактал называется "Кривая Госпера"
Сделан еще шаг к желанной цели....
Обратите внимание как оформлен вызов процедур.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
REM
REM  Фрактал "Кривая Госпера"
REM
 
DECLARE SUB D (x!, y!, l!, u!, t!, q!)
DECLARE SUB D2 (x!, y!, l!, u!, t!, q!)
CLS
CONST pi = 3.14159265#
 
SCREEN 11
WINDOW (0, 0)-(640, 480)
 
CALL D(100, 355, 400, 0, 4, 0)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB D (x, y, l, u, t, q)
   IF t > 0 THEN
      IF q = 1 THEN
         x = x + l * COS(u)
         y = y - l * SIN(u)
         u = u + pi
      END IF
      u = u - 2 * pi / 19
      l = l / SQR(7)
      CALL D2(x, y, (l), (u), (t) - 1, 0)
      CALL D2(x, y, (l), (u) + pi / 3, (t) - 1, 1)
      CALL D2(x, y, (l), (u) + pi, (t) - 1, 1)
      CALL D2(x, y, (l), (u) + 2 * pi / 3, (t) - 1, 0)
      CALL D2(x, y, (l), (u), (t) - 1, 0)
      CALL D2(x, y, (l), (u), (t) - 1, 0)
      CALL D2(x, y, (l), (u) - pi / 3, (t) - 1, 1)
   ELSE
      LINE (x, y)-(x + l * COS(u), y - l * SIN(u))
   END IF
END SUB
 
SUB D2 (x, y, l, u, t, q)
   CALL D((x), (y), (l), (u), (t), (q))
   x = x + l * COS(u)
   y = y - l * SIN(u)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.12.2015, 14:32  [ТС]
...
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
REM Треугольная спираль
 
DECLARE SUB Pic (f!, R!, n!)
CLS
 
CLEAR , , 2000
CONST pi = 3.14159265#
CONST p2 = pi / 1.5
CONST k = .95
 
SCREEN 11
WINDOW (-320, 240)-(320, -240)
 
CALL Pic(.7854, 250, 40)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB Pic (f, R, n)
   IF n = 0 THEN EXIT SUB
 
   x1 = R * COS(f)
   y1 = R * SIN(f)
   x2 = k * R * COS(f + p2)
   y2 = k * R * SIN(f + p2)
  
   LINE (x1, y1)-(x2, y2)
 
   CALL Pic(f + p2, R * k, n - 1)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.12.2015, 13:13  [ТС]
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
REM  Ледяной фрактал
 
DECLARE SUB D (x!, y!, l!, u!, t!)
DECLARE SUB D2 (x!, y!, l!, u!, t!)
CLS
CONST pi = 3.14159265#
 
SCREEN 11
 
CALL D(410, 10, 400, -pi, 5)
CALL D(10, 410, 400, 0, 5)
CALL D(10, 10, 400, -pi / 2, 5)
CALL D(410, 410, 400, pi / 2, 5)
END
 
SUB D (x, y, l, u, t)
   IF t > 0 THEN
      l = l / 2
      CALL D2(x, y, (l), (u), t - 1)
      CALL D2(x, y, (l) * .8, (u) + pi / 2, t - 1)
      CALL D2(x, y, (l) * .8, (u) - pi / 2, t - 1)
      CALL D2(x, y, (l), (u), t - 1)
   ELSE
      LINE (x, y)-(x + l * COS(u), y - l * SIN(u))
   END IF
END SUB
 
SUB D2 (x, y, l, u, t)
   CALL D((x), (y), (l), (u), t)
   x = x + l * COS(u)
   y = y - l * SIN(u)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.12.2015, 19:02  [ТС]
Программа вычисляет сумму ряда 1+1/4+ ...+1/n^2
Число членов до 1100

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
REM
REM    S = 1 + 1 / 2^2 + .... + 1 / n^2
REM
 
DECLARE FUNCTION RAD! (n!)
 
CLS
CLEAR , , 29000
INPUT "N = "; n
 
PRINT RAD(n)
PRINT FRE(-2)
END
 
FUNCTION RAD (n)
   IF n = 1 THEN
      RAD = 1
   ELSE
      R = RAD(n - 1)
      RAD = 1 / n / n + R
   END IF
END FUNCTION
0
 Аватар для vlisp
1121 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,449
25.12.2015, 19:19
Лишняя строчка
Цитата Сообщение от geh Посмотреть сообщение
R = RAD(n - 1)
Можно так
QBasic/QuickBASIC
1
RAD = 1 / n / n + RAD(n - 1)
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.12.2015, 19:50  [ТС]
vlisp
Очень хорошо, что вы указали "лишнюю строчку"
Дело в том, что эта строчка позволяет сберечь
стековые пространство. И если поступить как вы
предложили, то в стек попадут ненужные ему
вычисления 1/n/n. Я благодарен вам за ваше
предложение. Пусть его оценят и другие. Спасибо!
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.12.2015, 14:14  [ТС]
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
REM  Снежинка Коха
 
DECLARE SUB D (x!, y!, l!, u!, t!)
DECLARE SUB D2 (x!, y!, l!, u!, t!)
CLS
CONST pi = 3.14159265#
 
SCREEN 11
 
CALL D(110, 354, 400, pi / 3, 4)
CALL D(510, 354, 400, pi, 4)
CALL D(310, 8, 400, -pi / 3, 4)
END
 
SUB D (x, y, l, u, t)
   IF t > 0 THEN
      l = l / 3
      CALL D2(x, y, (l), (u), t - 1)
      CALL D2(x, y, (l), (u) + pi / 3, t - 1)
      CALL D2(x, y, (l), (u) - pi / 3, t - 1)
      CALL D2(x, y, (l), (u), t - 1)
   ELSE
      LINE (x, y)-(x + l * COS(u), y - l * SIN(u))
   END IF
END SUB
 
SUB D2 (x, y, l, u, t)
   CALL D((x), (y), (l), (u), t)
   x = x + l * COS(u)
   y = y - l * SIN(u)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.12.2015, 14:18  [ТС]
Чтобы обойти ограничения стека, надо дать
программе вычислить функцию при значениях
близким к границам стека и вставит эти значения
прямо в программу. Пример перед вами.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
REM Как обойти ограничения стека
REM          n <= 5400
REM  S = (1-1/2)+ ... +(1/n-1/(n+1))
 
DECLARE FUNCTION S! (n!)
 
CLS
CLEAR , , 28000
INPUT "N = "; n
 
PRINT "S ="; S(n)
PRINT FRE(-2)
END
 
FUNCTION S (n)
   IF n = 1 THEN
      S = .5
   ELSEIF n = 900 THEN
      S = .9988904
   ELSEIF n = 1800 THEN
      S = .9994448
   ELSEIF n = 2700 THEN
      S = .99963
   ELSEIF n = 3600 THEN
      S = .9997219
   ELSEIF n = 4500 THEN
      S = .9997755
   ELSE
      s1 = 1 / n / (n + 1)
      s2 = S(n - 1)
      S = s1 + s2
   END IF
END FUNCTION
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
27.12.2015, 11:02  [ТС]
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
REM
REM Фрактал "Папоротник"
REM
 
DECLARE SUB D (x!, y!, l!, u!)
DECLARE SUB Lii (x!, y!, l!, u!)
CLS
 
CONST pi = 3.14159265#
SCREEN 11
 
CALL D(320, 460, 140, pi / 2)
END
 
SUB D (x, y, l, u)
   IF l > 1 THEN
      CALL Lii(x, y, l, u)
      x = x + l * COS(u)
      y = y - l * SIN(u)
      CALL D((x), (y), l * .4, u - 14 * pi / 30)
      CALL D((x), (y), l * .4, u + 14 * pi / 30)
      CALL D((x), (y), l * .7, u + pi / 30)
   END IF
END SUB
 
SUB Lii (x, y, l, u)
   LINE (x, y)-(x + l * COS(u), y - l * SIN(u))
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
27.12.2015, 11:07  [ТС]
Эта функция задана рекуррентно. И ее можно
вычислить только с помощью рекурсии.

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
REM Вычисление функции f(n),
REM  заданной рекуррентно
 
DECLARE FUNCTION f! (n!)
CLS
 
CLEAR , , 20000
INPUT "N = "; n
 
PRINT f(n)
END
 
FUNCTION f (n)
   IF n = 1 THEN
      f = 1
   ELSE
      IF n MOD 2 = 0 THEN
         f = f(n / 2) + 2
      ELSEIF n MOD 3 = 0 THEN
         f = f(n / 3) + 3
      ELSEIF n MOD 5 = 0 THEN
         f = f(n / 5) + 5
      ELSEIF n MOD 7 = 0 THEN
         f = f(n / 7) + 7
      ELSE
         f = n
      END IF
   END IF
END FUNCTION
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2015, 11:07

Решение задачи с использованием рекурсии
Здравствуйте. Возникли затруднения с решением задачи. Задача: Пусть {a}_{1}=u; {b}_{1}=v; {a}_{i}=\frac{{2}^{i}}{{a}_{i-1}*{b}_{i-1}};...

Решение уравнения 0.7х = 2 с использованием рекурсии
Здравствуйте, форумчане! Возникла такая вот проблемка: как решить уравнение 0.7х = 2 с помощью рекурсии. Вот код, который не работает...

Решение уравнения методом бисекции с использованием рекурсии
Добрый день! Задачу задали в универе... Написать-то написал, сам метод халявный, но с рекурсией что-то запарился. 1....

Решение задач с использованием процедур
Написать процедуру рисования фигуры из звездочек: ******** *** *** ** ** * * * * ** ** *** *** ********

Решение задач с использованием процедур
Написать процедуру рисования фигуры из звездочек: ******** *** *** ** ** * * * * ** ** *** *** ********


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru