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

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

01.08.2015, 06:55. Показов 8921. Ответов 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
17.11.2015, 18:40  [ТС]
Студворк — интернет-сервис помощи студентам
Эта второй вариант программы, вычисляющей определитель
произвольной длины. Жемчужиной программы является код
ввода данных (строки 23-44). Читатели, знакомые с операторами
DATA - READ, не поверят своим глазам. Как можно ввести
часть матрицы? Ведь READ считывает все подряд! Этого не
знает даже Билл Гейтс (да ему и некогда). Все гениальное просто.
Забытая богом переменная q решает все проблемы!!!

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
REM  Дана матрица a()
REM  Надо вычислить ее определитель, используя
REM  метод разложения по первой строке
REM  D(n) = SUMMA (-1)^(1 + j)*D(n - 1) ; j=1, 2, ... ,n
REM  
REM  Время вычисления пропорционально n!
REM  Для n = 9 это примерно 10 секунд
REM
 
DECLARE FUNCTION DET& (n AS INTEGER, a() AS INTEGER)
DECLARE SUB ALG (j%, n%, a() AS INTEGER, b() AS INTEGER)
 
OPTION BASE 1
DEFINT I-J
 
CLS
CLEAR , , 20000
DIM SHARED n AS INTEGER
INPUT "n = "; n
 
DIM a(n, n) AS INTEGER
 
DATA 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
DATA 0, 2, 2, 3, 4, 5, 6, 7, 8, 9
DATA 0, 0, 3, 2, 3, 4, 5, 6, 7, 8
DATA 0, 0, 0, 4, 2, 3, 4, 5, 6, 7
DATA 0, 0, 0, 0, 5, 2, 3, 4, 5, 6
DATA 0, 0, 0, 0, 0, 6, 2, 3, 4, 5
DATA 0, 0, 0, 0, 0, 0, 7, 2, 3, 4
DATA 0, 0, 0, 0, 0, 0, 0, 8, 2, 3
DATA 0, 0, 0, 0, 0, 0, 0, 0, 9, 2
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 10
 
FOR i = 1 TO 10
   FOR j = 1 TO 10
      IF i <= n AND j <= n THEN
         READ a(i, j)
         PRINT a(i, j);
      ELSE
         READ q
      END IF
   NEXT j
   IF i <= n THEN PRINT
NEXT i
 
PRINT : PRINT
PRINT "|A| = "; DET(n, a())
END
 
SUB ALG (j AS INTEGER, n AS INTEGER, a() AS INTEGER, c() AS INTEGER)
   DEFINT K-L
 
   FOR k = 1 TO n - 1
   FOR l = 1 TO n - 1
      IF l < j THEN
         c(k, l) = a(k + 1, l)
      ELSE
         c(k, l) = a(k + 1, l + 1)
      END IF
   NEXT l
   NEXT k
END SUB
 
FUNCTION DET& (n AS INTEGER, a() AS INTEGER)
   DIM D AS LONG
   DIM m AS INTEGER
   DIM b(n, n) AS INTEGER
 
   IF n = 1 THEN
      DET = a(1, 1)
   ELSE
      D = 0
 
      FOR m = 1 TO n
         CALL ALG((m), n, a(), b())
         D = D - (-1) ^ m * a(1, m) * DET(n - 1, b())
      NEXT m
 
      DET = D
   END IF
END FUNCTION

Не по теме:


Сегодня у меня праздник души. Это мое сообщение под номером 1000. Но пусть не сетуют те, кто его не поймет с первого раза. Дорога на вершину QBasic усеяна шипами Алых Роз. Нам ли! Сыновьям Славного Бейсика! Потомкам арифмометра и логарифмической линейки боятся трудностей! Так преодолеем все преграды и пусть исполнится в жизни все, что казалось мечтой!
Вместе с QBasic (ом) - Мир и Процветание

0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
18.11.2015, 13:28  [ТС]
Эта программа вычисляет число пи

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 a(2n) = SQR(b^2 + (1 - SQR(1 - b^2))^2)
REM             где b = a(n) / 2
 
DECLARE FUNCTION f! (n AS INTEGER)
DIM SHARED n AS INTEGER
DIM i AS INTEGER
 
CLS
CLEAR , , 29000
 
COLOR 15
i = 6
DO
   n = i
   IF i = 96 THEN
      COLOR 11
      PRINT USING "pi(####) = #.###### "; i; n * f(n) / 2;
      PRINT "Number of Arhimed"
      COLOR 15
   ELSE
      PRINT USING "pi(####) = #.###### "; i; n * f(n) / 2
   END IF
   i = 2 * i
LOOP UNTIL i > 10000
 
END
 
FUNCTION f! (n AS INTEGER)
                  
   IF n = 6 THEN
      f = 1
   ELSE
      b = f(n / 2) / 2
      f = SQR(b ^ 2 + (1 - SQR(1 - b ^ 2)) ^ 2)
   END IF
END FUNCTION
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
19.11.2015, 18:42  [ТС]
Программа запрашивает ввод чисел
(0 - конец ввода)
И выводит на экран их сумму

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE FUNCTION SUMMA ()
 
CLS
CLEAR , , 20000
PRINT "SUMMA ="; SUMMA
END
 
FUNCTION SUMMA
DIM n  AS LONG
   INPUT n
   IF n THEN SUMMA = SUMMA + n
END FUNCTION
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
20.11.2015, 20:07
Читатели, знакомые с операторами
DATA - READ, не поверят своим глазам. Как можно ввести
часть матрицы? Ведь READ считывает все подряд! Этого не
знает даже Билл Гейтс (да ему и некогда).
Боже сколько пафоса!
Ну да Билли круглый идиот, да и Пол Аллен тоже, приложили свои видите ли кривые клешни к IBM
бейсику на сях, во суровые времена, когда малыша геха ещё на свете не было, конечно они не
знают как работают оверлеи и дата секции в программах, зачем им это, они же круглые идиоты.
Хаха, ладно, ладно, не кипишуем, троллинг засчитан...)))
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
21.11.2015, 17:47  [ТС]
Очень интересная программа
Тот, кто сумеет ее самостоятельно повторить
гораздо умнее, чем он о себе думает.

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 
REM   СНЕЖИНКА
REM 
 
DECLARE SUB SCH (x!, y!, d!)
 
CLS
CONST f = .866
 
SCREEN 11
WINDOW (-400, 300)-(400, -300)
CALL SCH(0, 0, 200)
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB SCH (x, y, d)
  
   IF d < 10 THEN EXIT SUB
 
   LINE (x, y)-(x + d, y)
   LINE (x, y)-(x + d / 2, y + f * d)
   LINE (x, y)-(x - d / 2, y + f * d)
   LINE (x, y)-(x - d, y)
   LINE (x, y)-(x - d / 2, y - f * d)
   LINE (x, y)-(x + d / 2, y - f * d)
 
   CALL SCH(x + d, y, d / 3)
   CALL SCH(x + d / 2, y + f * d, d / 3)
   CALL SCH(x - d / 2, y + f * d, d / 3)
   CALL SCH(x - d, y, d / 3)
   CALL SCH(x - d / 2, y - f * d, d / 3)
   CALL SCH(x + d / 2, y - f * d, d / 3)
     
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
21.11.2015, 20:16  [ТС]
Вот еще программа попроще. (Смотрите рис.)

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
DECLARE SUB Ris (x!, y!, d!)
 
d = 100
SCREEN 11
WINDOW (-100, 100)-(100, -100)
 
CALL Ris(0, 0, d)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB Ris (x, y, d)
 
IF d < 10 THEN EXIT SUB
   LINE (x, y + d / 2)-(x, y - d / 2)
   LINE (x + d / 2, y)-(x - d / 2, y)
   LINE (x - d / 3, y + d / 3)-(x + d / 3, y - d / 3)
   LINE (x + d / 3, y + d / 3)-(x - d / 3, y - d / 3)
 
   CALL Ris(x - d / 2, y, d / 2)
   CALL Ris(x + d / 2, y, d / 2)
   CALL Ris(x, y - d / 2, d / 2)
   CALL Ris(x, y + d / 2, d / 2)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
21.11.2015, 20:32

Не по теме:

Цитата Сообщение от geh Посмотреть сообщение
Потомкам арифмометра и логарифмической линейки
Ваши прародители арифмометр и логарифмическая линейка ?
Это бы многое объяснило, самообучающийся киборг, робот-математик постигает азы Basic.
Очень смелый эксперимент, я за вами слежу.

0
22.11.2015, 01:03

Не по теме:

самообучающийся киборг
Нифига не киборг, просто валом у пацана времени, вот и сидит в режиме 24\7 хе*нёй страдает...
А вообще пущай, пущай сидит больше, хе хе...

Очень смелый эксперимент
Эксперимент занятный, но хомо долго эволюционирует в сапиенса, можно не дождаться.
Интересно куда же ударится, в какую область и что будет после QBasic.

0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
22.11.2015, 15:42  [ТС]
Треугольник Серпинского

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
DECLARE SUB TRS (d!, x1!, y1!, x2!, y2!)
CLS
SCREEN 11
WINDOW SCREEN (-20, -20)-(300, 300)
 
CALL TRS(10, 0, 0, 256, 256)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB TRS (d, x1, y1, x2, y2)
IF y2 - y1 > d THEN
    
   LINE ((x1 + x2) / 2, y1)-(x1, y2)
   LINE ((x1 + x2) / 2, y1)-(x2, y2)
   LINE (x1, y2)-(x2, y2)
 
   x11 = (x1 * 3 + x2) / 4
   y11 = y1: x21 = (x2 * 3 + x1) / 4
   y21 = (y1 + y2) / 2
   x12 = x1
   y12 = (y1 + y2) / 2
   x22 = (x1 + x2) / 2
   y22 = y2
   x13 = (x1 + x2) / 2
   y13 = (y1 + y2) / 2
   x23 = x2
   y23 = y2
 
   CALL TRS(d, x11, y11, x21, y21)
   CALL TRS(d, x12, y12, x22, y22)
   CALL TRS(d, x13, y13, x23, y23)
END IF
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
23.11.2015, 10:04  [ТС]
Треугольник Серпинского 2.

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
DECLARE SUB ASD (x1!, y1!, r!)
 
CLS
SCREEN 11
WINDOW (0, 0)-(500, 400)
 
CALL ASD(250, 250, 120)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB ASD (x1, y1, r)
   CIRCLE (x1, y1), r
   r1 = r / 2
   IF r > 20 THEN
      x12 = x1
      y12 = y1 - r
      x13 = x1
      y13 = y1 + r
      x14 = x1 - r
      y14 = y1
      x15 = x1 + r
      y15 = y1
 
      CALL ASD(x12, y12, r1)
      CALL ASD(x14, y14, r1)
      CALL ASD(x15, y15, r1)
   END IF
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
23.11.2015, 18:16  [ТС]
Дана строковая переменная, состоящая из скобок
Программа проверяет правильность их расстановки.

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
DECLARE SUB SKO (s AS STRING)
CLS
DIM SHARED s AS STRING
DIM SHARED k AS INTEGER
 
s = "((())())(()())"
CALL SKO(s)
                                 
IF k THEN PRINT "NO" ELSE PRINT "YES"
END
 
SUB SKO (s AS STRING)
   IF LEN(s) = 0 THEN EXIT SUB
  
   IF MID$(s, 1, 1) = ")" THEN
      k = k - 1
   ELSE
      k = k + 1
   END IF
 
   IF k < 0 THEN EXIT SUB
   s = RIGHT$(s, LEN(s) - 1)
   CALL SKO(s)
END SUB
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
23.11.2015, 19:46
geh, строку 22 я бы закодировал так:

Visual Basic
1
      s=mid$(s,2)
В VB это работает.
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
23.11.2015, 20:45  [ТС]
Catstail,
Спасибо! Это и в QBasic работает.
Просто когда углублен в алгоритм, на такие
"Мелочи" не обращаешь внимания. Спасибо!
PS.
Ваш вариант компактный и красивый.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.11.2015, 17:05  [ТС]
Эта программа рисует дерево. Оно может быть не очень красиво.
Но программа проста. На основе ее можно создать более красивые,
но менее понятные программы. Посмотрите, тут в процедуре рисуется
всего одна линия. Зато происходит два вызова процедуры и число линий
множителя. Чем больше вызовов, тем сложнее рисунок.

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
REM
REM        ДЕРЕВО
REM
 
DECLARE SUB DER (x1!, y1!, x2!, y2!, h!)
 
CLS
CONST f = .6
CONST k = 1.4
 
SCREEN 11
WINDOW (0, 480)-(640, 0)
 
CALL DER(320, 20, 320, 150, 80)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB DER (x1, y1, x2, y2, h)
   IF h < 7 THEN EXIT SUB
 
   LINE (x1, y1)-(x2, y2)
 
   x11 = x2
   y11 = y2
   x12 = x2 + h * SIN(f)
   y12 = y2 + h * COS(f)
 
   x21 = x2
   y21 = y2
   x22 = x2 - h * SIN(f)
   y22 = y2 + h * COS(f)
 
   CALL DER(x11, y11, x12, y12, h / k)
   CALL DER(x21, y21, x22, y22, h / k)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.11.2015, 10:40  [ТС]
Это продолжение предыдущего сообщения.
Программа рисует более красивое дерево.
Мне хотелось бы добавить следующее.
Изменяя параметры можно рисовать разные деревья:
высокие и узкие, низкие и раскидистые. И добавив в
программу несколько вызовов процедур с разными
параметрами, получим целый лес деревьев ...
Копируйте эту программу, изменяйте параметры и масштаб
и только тогда вы познаете рекурсию!

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
REM
REM        ДЕРЕВО 2.
REM
 
DECLARE SUB DER (x1!, y1!, x2!, y2!, h!)
 
CLS
CONST f = .3
CONST k = 1.4
 
SCREEN 11
WINDOW (0, 480)-(640, 0)
 
CALL DER(320, 20, 320, 150, 80)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB DER (x1, y1, x2, y2, h)
   IF h < 10 THEN EXIT SUB
 
   LINE (x1, y1)-(x2, y2)
 
   x11 = x2
   y11 = y2
   
   x12 = x2 + ((x2 - x1) * COS(f) - (y2 - y1) * SIN(f)) / k
   y12 = y2 + ((y2 - y1) * COS(f) + (x2 - x1) * SIN(f)) / k
 
   x21 = x2
   y21 = y2
   x22 = x2 + ((x2 - x1) * COS(f) + (y2 - y1) * SIN(f)) / k
   y22 = y2 + ((y2 - y1) * COS(f) - (x2 - x1) * SIN(f)) / k
 
   CALL DER(x11, y11, x12, y12, h / k)
   CALL DER(x21, y21, x22, y22, h / k)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.11.2015, 17: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
29
30
REM
REM  Буква Н
REM
 
DECLARE SUB EN (x!, y!, h!)
 
CLS
 
SCREEN 11
WINDOW (-320, 240)-(320, -240)
 
CALL EN(0, 0, 100)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB EN (x, y, h)
   IF h < 10 THEN EXIT SUB
 
   LINE (x - h, y - h)-(x - h, y + h)
   LINE (x + h, y - h)-(x + h, y + h)
   LINE (x - h, y)-(x + h, y)
 
   CALL EN(x + h, y + h, h / 2)
   CALL EN(x + h, y - h, h / 2)
   CALL EN(x - h, y + h, h / 2)
   CALL EN(x - h, y - h, h / 2)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.11.2015, 13:12  [ТС]
Эта программа вычисляет числа Фибоначчи.
Обратите внимание на строки 21-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
REM fi(46) = 1 836 311 903
 
DECLARE FUNCTION SSTR$ (n%)
DECLARE FUNCTION fi& (m%)
 
DIM n AS INTEGER
CLS
CLEAR , , 29000
PRINT "N <= 46"
 
DO
   INPUT "n = "; n
LOOP UNTIL n <= 46
 
PRINT " fi(" + SSTR(n) + ") = "; fi(n)
END
 
FUNCTION fi& (m AS INTEGER)
   IF m = 1 OR m = 2 THEN
      fi = 1
   ELSEIF m = 23 THEN
      fi = 28657
   ELSEIF m = 24 THEN
      fi = 46368
   ELSE
      fi = fi(m - 1) + fi(m - 2)
   END IF
END FUNCTION
 
FUNCTION SSTR$ (n AS INTEGER)
   SSTR = LTRIM$(STR$(n))
END FUNCTION
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.11.2015, 13:22  [ТС]
Эта программа рисует равносторонние треугольники.
Каждый из них повернут относительно другого и вписан.

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 f (fi!, r!)
 
CLS
CLEAR , , 20000
 
CONST f2 = 2.0944
DIM SHARED df
DIM SHARED k
df = .15708
k = .67
 
SCREEN 11
WINDOW (-320, 240)-(320, -240)
 
CALL f(0, 240)
 
PRINT "ENTER"
SLEEP 0
SCREEN 0
END
 
SUB f (fi, r)
   IF r < 20 THEN EXIT SUB
 
   x1 = r * COS(fi)
   y1 = r * SIN(fi)
   x2 = r * COS(fi + f2)
   y2 = r * SIN(fi + f2)
   x3 = r * COS(fi - f2)
   y3 = r * SIN(fi - f2)
   fi = fi + df
 
   LINE (x1, y1)-(x2, y2)
   LINE (x2, y2)-(x3, y3)
   LINE (x3, y3)-(x1, y1)
 
   CALL f(fi + df, k * r)
END SUB
Миниатюры
Решение задач с использованием рекурсии  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
26.11.2015, 19:01
Цитата Сообщение от geh Посмотреть сообщение
Зачем считать все, когда можно воспользоваться вычисленными значениями
- очень странный прием... Сам по себе алгоритм лобового вычисления чисел Фибоначчи крайне неэффективен (из-за многократного перевычисления одного и того же). Стандартный способ увеличения эффективности - использование накопительных параметров:

QBasic/QuickBASIC
1
2
3
4
5
6
7
FUNCTION fi& (m AS INTEGER,p AS INTEGER, c AS INTEGER)
   IF m=1 THEN
      fi&=c
   ELSE
      fi&=fi&(m-1,c,c+p)
   END IF
END FUNCTION
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.11.2015, 20:34  [ТС]
Catstail,
Спасибо! То, что предложили вы, называется
Динамическим программированием. Программа
аккумулирует свои вычисления, чтобы не считать их
тысячи и миллионы раз. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2015, 20:34
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru