sqrt函数实现——二分法、牛顿迭代法

在leetcode练习时,碰到一道经典的面试题,如何实现sqrt()开平方函数。当然,很简单的是调用系统函数,但是难道不能自己实现这个函数的功能吗?于是一番思索和查阅资料,看到下面的方法。

二分法求解

二分法这个应该很熟悉,在二分查找算法中就有具体的体现。应用在此题上,也是合适不过的。
首先分析一下这道题:
实现sqrt函数功能,求一个数的开平方,即求 f ( x ) = x 2 − N f(x) = x^2 - N f(x)=x2N这个函数 f ( x ) = 0 f(x) = 0 f(x)=0的非负解。

  • 原理
    二分法的原理很简单,就是通过缩减区间来确定解的位置。通过图来说明:
    二分法
  • 实现步骤
    • 选择区间[a, b],f(a)与f(b)异号。
    • 获得区间中值mid,以及f(mid)值。
    • 若f(a) * f(mid) < 0,即f(a)与f(mid)异号,取新区间[a, mid]。相反,取区间[mid, b]。
    • 重复上两步操作,直到达到类型精度停止。
  • 代码实现
int BisectionSqrt(int x)
{
	double low = 0, high = x + 0.25, mid = (low + high) / 2;
	while (mid - low > DBL_EPSILON && high - mid > DBL_EPSILON)  // 精度
	{
		if ((mid * mid - x) * (low * low - x) < 0)
			high = mid;
		else low = mid;
		mid = (high + low) / 2;
	}
	return int(mid);
}
注:

初始上界为x + 0.25,而非x。(这一点我不是很懂,希望大佬指点)

牛顿迭代法

看概念:
又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。方法使用函数 f ( x ) f(x) f(x)的泰勒级数的前面几项来寻找方程 f ( y ) = 0 f(y) = 0 f(y)=0的根。
可以看出满足上面的题目分析,可以求得根。

  • 原理步骤
    选择一个接近函数 f ( x ) f(x) f(x)零点的 x 0 x_0 x0,计算相应的 f ( x 0 ) f(x_0) f(x0)和切线斜率 f ′ ( x 0 ) f&#x27;(x_0) f
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值