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

 

Косвенной или взаимной рекурсией называется организация вызовов нескольких методов по кругу (первый метод вызывает второй, второй – третий, …, n-ый метод вызывает первый). Самым простым вариантом косвенной рекурсии можно считать случай, когда метод а() вызывает метод b(), который вызывает метод a(). Рассмотрим рекурсивный способ вычисления значений функций синуса и косинуса в соответствии со следующими тождествами:

Здесь функции синуса и косинуса вызывают одна другую и поэтому являются взаимно рекурсивными.

 

Рис.6.3 – Дерево стека вызовов рекурсивного метода fib(5)


Задача 6.3 Напишите рекурсивные методы вычисления синуса и косинуса.

Объяснение: условием завершения рекурсии будем считать равенство аргумента х нулю с точностью до величины eps=0.001. При возврате из самого глубокого рекурсивного вызова нужно будет вычислить нерекурсивно синус и косинус малого числа. Используем для этого первые два члена разложения тригонометрических функций в степенной ряд.

import java.util.Scanner;

public class Ex_6_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,54030

cos(x)= -0,84147