Косвеннойиливзаимной рекурсиейназывается организация вызовов нескольких методов по кругу (первый метод вызывает второй, второй — третий, …, n-ый метод вызывает первый). Самым простым вариантом косвенной рекурсии можно считать случай, когда метод а () вызывает метод b (), который вызывает метод a (). Рассмотрим рекурсивный способ вычисления значений функций синуса и косинуса в соответствии со следующими тождествами:
Здесь функции синуса и косинуса вызывают одна другую и поэтому являются взаимно рекурсивными.
рекурсия массив сортировка ветвление Рис. 6.3 — Дерево стека вызовов рекурсивного метода fib (5)
Задача 6.3 Напишите рекурсивные методы вычисления синуса и косинуса.
Объяснение: условием завершения рекурсии будем считать равенство аргумента х нулю с точностью до величины eps=0.001. При возврате из самого глубокого рекурсивного вызова нужно будет вычислить нерекурсивносинус и косинус малого числа. Используем для этого первые два члена разложения тригонометрических функций в степенной ряд.
import java.util.Scanner;
public class Ex6_3.
{.
static double cos (double x){.
if (Math.abs (x)<10e-4).
return x*(1-x*x/6);
else.
return 2*sin (x/2)*cos (x/2);
}.
static double sin (double x) {.
if (Math.abs (x)<10e-4).
return (1-x*x/2);
else.
return Math. pow (cos (x/2), 2)-Math.pow (sin (x/2), 2);
}.
public static void main (String[] args).
{.
Scanner scan=new Scanner (System.in);
System.out.printf («Введите x:»);
double x = scan. nextDouble ();
System.out.printf («sin (x)= %5.5f%n», sin (x));
System.out.printf («cos (x)= %5.5f», cos (x));
}.
}.
Результат:
Введите x:1.
sin (x)= -0,54 030.
cos (x)= -0,84 147.