开根号--递归函数和二分法的结合

一,原理

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)自己写代码,为什么要写注释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值