Технический форум

Технический форум (http://www.tehnari.ru/index.php)
-   Basic (http://www.tehnari.ru/forumdisplay.php?f=127)
-   -   Смешанная рекурсия (http://www.tehnari.ru/showthread.php?t=249704)

iks2 30.10.2016 11:35

Смешанная рекурсия
 
Эта программа вычисляет две функции sin(x) и cos(x). Переменная икс задается в градусах (x - натуральное число). Программа написана в качестве примера применения косвенной рекурсии. Если кто не знает что такое косвенная рекурсия, то я поясню.
1. В обычной рекурсии функция А() вызывает сама себя
2. В косвенной рекурсии функция А() вызывает функцию Б(). А та в свою очередь вызывает функцию А(). (это простой случай)
3. В более сложном случае. Одна функция вызывает другую. Та - третью (а также может вызвать себя или вторую или первую). Смесь невообразимая.
4. Здесь две функции. И они вызывают то себя, то друг друга...

Формулы для справки:
1) sin(n) = sin(n-1)cos(1) + cos(n-1)sin(1)
2) cos(n) = cos(n-1)cos(1) - sin(n-1)sin(1)
3) sin(2n) = 2sin(n)cos(n)
4) cos(2n) = cos(n)^2 - sin(n)^2

Код:

DECLARE FUNCTION SS$ (n%)
DECLARE FUNCTION S (n%)
DECLARE FUNCTION C (n%)
DIM n AS INTEGER
DIM SHARED s1, c1

CLS
CLEAR , , 26000
INPUT "n = "; n
s1 = .017452406#
c1 = .999847695#

PRINT "sin(" + SS(n) + ")= "; S(n)
PRINT "cos(" + SS(n) + ")= "; C(n)
END

FUNCTION C (n AS INTEGER)
DIM sn, cn
  IF n = 0 THEN
      C = 1
  ELSE
      IF n MOD 2 = 0 THEN
        sn = S(n \ 2)
        cn = C(n \ 2)
        C = cn * cn - sn * sn
      ELSE
        sn = S(n - 1)
        cn = C(n - 1)
        C = cn * c1 - sn * s1
      END IF
  END IF
END FUNCTION

FUNCTION S (n AS INTEGER)
DIM sn, cn
  IF n = 0 THEN
      S = 0
  ELSE
      IF n MOD 2 = 0 THEN
        sn = S(n \ 2)
        cn = C(n \ 2)
        S = 2 * sn * cn
      ELSE
        sn = S(n - 1)
        cn = C(n - 1)
        S = sn * c1 + cn * s1
      END IF
  END IF
END FUNCTION

FUNCTION SS$ (n AS INTEGER)
  SS = LTRIM$(STR$(n))
END FUNCTION



Часовой пояс GMT +4, время: 03:41.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.