我的任务是使用他在课堂上给我们的算法计算Pi,确定正确的数字,并使用while循环和递归方法将Pi估计为六位数。但是我的“超级聪明的教授”没有告诉我们关于递归方法的血腥事情,当我给他发电子邮件时,他因为没有通过查看而得到它而生我的气。这是我的代码到目前为止,我省略了我的while循环方法和递归方法,因为我不知道如何做到这些。
public static final double REAL_PI = 3.14159;//PI is the value prof gave us on the handout
public static double Pi = 0; //Pi is the value of Pi that this program calculates
public static int m = 0;
public static void main (String [] args)
{
Algorithm(); //calls on method of calculating pi
System.out.println("Calculated pi: " + Pi); //prints out pi
countDigits(Pi); //calls on countdigits method
System.out.println("Number of digits: " + c); //has the computer print out the count because that's how many digits are the same
PiRecur(); //calls on estimate digits method
}
public static double Algorithm() //should return a double (pi)
{
for(m=1; m<=100000; m++)
{
Pi += 4*(Math.pow(-1, m-1)/((2*m)-1));//Math.pow uses math package to calculate a power to use the algorithm
}
return Pi;
}
public static int countDigits (double Pi)
{
int a = (int) Pi; //the int cast makes Pi and REAL_PI into integers so the program can compare each digit separately
int b = (int) REAL_PI;
int c = 0;
int count = 0;
while(a == b)//if m less then or equal to 100,000 then while loop runs
{
count ++;
a = (int) (Pi*(Math.pow(10,count))); //if a=b then the computer will multiply Pi and REAL_PI by 10
b = (int) (REAL_PI*(Math.pow(10,count)));
/*when you input a and b
* while loop compares them
* if a = b then loop continues until a doesn't equal b and loop ends
*/
}
c = count; //gives c the value of the count so it can be used outside the method
return count;
}
}
答案 0 :(得分:2)
我不确定使用while
循环和递归的解决方案是如何循环的,因为我无法读懂你的教授的想法,但我能想到两个使用其中一种的不同解决方案。
使用while
循环:
您不会以任意数量的迭代(在您的示例中为100000)运行算法,并希望您足够接近预期结果。您使用while
循环,并在每次迭代时检查您当前的Pi计算是否足够接近目标。
public static double Algorithm()
{
int m = 1;
double Pi = 0.0;
while (countDigits(Pi) < 6) {
Pi += 4*(Math.pow(-1, m-1)/((2*m)-1)); // I'm assuming this formula works
m++;
}
return Pi;
}
使用递归:
可以将相同的解决方案转换为递归。这次,您将初始索引m
(1)和初始值Pi
(0)提供给Algorithm
。该方法将m
&n-39术语添加到Pi
。如果Pi
的新值不够好(由countDigits
确定),则会进行递归调用,将m+1
项添加到Pi
并再次检查新的价值足够好。当Pi
的值精确到6位时,递归将停止。
public static double Algorithm(int m,double Pi)
{
Pi += 4*(Math.pow(-1, m-1)/((2*m)-1));
if (countDigits(Pi) < 6)
Pi += Algorithm(m+1,Pi);
return Pi;
}
您可以使用以下方法调用该方法:
Algorithm (1,0.0);