一,原理
1,创建一个函数,传入参数目标数字n,左边界l,右边界r,默认参数误差epsilon。
2,先计算左右边界平均值avg,比较avg的平方与n,来判断avg取大了还是取小了。
3,用avg来代替r或l,实现左右边界的更新。
4,不断缩小平方与n差的误差,直至差小于epsilon。这是基例。
5,最后用return返还avg,同时在函数末尾用return调用函数本身,实现递归。
二,代码展示
#include<stdio.h>
#include<math.h>
double sqrt(double n, double l, double r, double epsilon = 1e-5)
{
double avg = (r + l) / 2;
if (fabs(avg * avg - n) < epsilon)
{
return avg;
}
else if (avg * avg < n)
{
return sqrt(n,avg, r, epsilon);
}
else if (avg * avg > n)
{
return sqrt(n, l, avg, epsilon);
}
else
{
return avg;
}
}
int main()
{
double root = sqrt(36, 0, 36);
printf("the square root is %lf", root);
}
三,知识点
1,递归函数
2,算法——二分法,逐渐逼近结果
四,关键
1,注意参数和返还值的数据类型,都是double类型,实在不行可以用模板函数,使用模板参数来占位,下面简单介绍一下:
1. 模板函数的基本概念
模板函数使用模板参数来代替具体的数据类型。在定义函数时,你并不知道确切的类型,而是在使用函数时才传递具体的类型。
1.1 模板函数的语法
模板函数通过 template 关键字来定义。其基本语法如下:
template <typename T>
返回类型 函数名(T 参数名)
{
// 函数体
}
1.2 模板函数的简单例子
下面是一个实现泛型的交换函数的例子,该函数可以交换任意类型的数据:
#include <iostream>
// 定义一个模板函数
template <typename T>
void swapValues(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
swapValues(x, y); // 交换 int 类型的值
std::cout << "x = " << x << ", y = " << y << std::endl;
double a = 3.14, b = 2.71;
swapValues(a, b); // 交换 double 类型的值
std::cout << "a = " << a << ", b = " << b << std::endl;
return 0;
}
2,fabs函数用于返还绝对值
3,l和r的更新
五,题外话
1,不知道大家还希望看到什么内容可以私信我,可以给我推荐一些算法题(如果我能做出来的话,我肯定会发表出来,试试多种方法)
2,我以后打算所学的知识点去确定刷什么题,现在我才学到函数的基本概念,同时也拓展了一些知识把
3,讲个笑话
我讨厌两件事:
1)看别人的代码,为什么不写注释。
2)自己写代码,为什么要写注释。