Косвенная рекурсия
Косвенной или взаимной рекурсией называется организация вызовов нескольких методов по кругу (первый метод вызывает второй, второй – третий, …, 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