(算法练习)——迭代求立方根/平方根

要求:
http://codeup.cn/problem.php?cid=100000588&pid=10
说明:
特别把这一题拿出来,这一题用递归很容易实现,but,第一次写的这个代码,没有用一个中间变量,导致超时了。。
这是超时的代码:

#include 
#include 
 
double F(int a,int b,double x){
    if(b == 0){
        x = (double)a;
    }
    else{
        b = b - 1;
        x = F(a,b,x)*2/3 + a/(3*F(a,b,x)*F(a,b,x));
         
    }
    return x;
}
 
int main(){
    int a,n;
     
    while(scanf("%d %d",&a,&n) != EOF){
        double t = 0;
        printf("%.6f\n",F(a,n,t));  
    }
    return 0;
}

这是修改后的代码:

#include 
#include 
double a,x; 
double F(double a,int b,double x){
    if(b == 0){
        x = a;
    }
    else{
        double temp = F(a,b-1,x);//这种效率明显比写多个 F(a,b-1,x)效率要高!!! 
        x = temp*(2.0/3.0) + a/(3*temp*temp);  
    }
    return x;
}
 
int main(){
    int n;
    while(scanf("%lf %d",&a,&n) != EOF){
        printf("%.6f\n",F(a,n,x));  
    }
    return 0;
}

水题,但还是记录下,这种递归似乎找到点门路了。。这一题要求前后两次绝对值之差<0.00001,而不是明确告诉你迭代多少次,所以b先不设上限,当符合条件时break即可
问题 1021: [编程入门]迭代法求平方根
https://www.dotcpp.com/oj/problem1021.html
代码:

#include 
#include 
#include 
using namespace std;

double F(int a,int b,double x){
	if(b == 0){
        x = (double)a;
    }
    else{
        b = b - 1;
        x = (F(a,b,x)+ a/F(a,b,x))/2;   
    }
    return x;	
}

int main(){
	int a;
	scanf("%d",&a);
	double x = 0;
	for(int b = 1;;b++){
		if(F(a,b,x)-F(a,b-1,x) <0.00001 && F(a,b,x)-F(a,b-1,x) > -0.00001){
			printf("%.3f\n",F(a,b,x));
			break;	
		}
	}
}

你可能感兴趣的:(入门篇——数学问题)