【牛顿迭代法】x的平方根

在刷leetcode 69 .x的的平方根的时候, 题解中提到了这个牛顿迭代法, 我觉得这个是一个好的算法,在很多求值的领域都可以用上,因为满足牛顿迭代法的会收敛于一个值,这里有点想二分法查找,但是个人感觉比二分法查找更快

首先我们来看一下这道题目吧:
在这里插入图片描述

class Solution {
    public int mySqrt(int x) {

    }
}

其实我们Math中有一个Math.sqrt()方法就是用来求开方的(int) Math.sqrt(x);,但是这样子做,我们就没必要学算法了啊。

题解中提到了一个牛顿迭代法,我觉得特别微妙
在这里插入图片描述
大概思路就是这样的:

  • 我们先假设x开平方之后的值就为x(这里大胆假设,例如2开平方之后的值假设为4,其实这已经很离谱了,但是牛顿迭代法可以让这个假设的值不断收敛于最真实的值)
  • 因为求开方的函数就是f(x)=x^2-a,(这里a就是我们要求开方的数字,这里是2),因为是函数的原因,所以函数上每一个点的斜率都是f(x)’=2x在这里插入图片描述
  • 那么T点的值,是不是比4的值更加接近于我们要求的2的开方的值?
  • 那么我们B的值怎么求呢?
  • 我们已经知道斜率是8了,斜率的定义就是tana,也就是对边/邻边
  • 所以A/B=k的,所以B=A/k,也就是B=f(x)/2x
  • 所以T点的值为:x-B=x-f(x)/2x
  • 我们得到T点的值之后,我们又可以用相同的方法得到下一个点的值,这样就可以无限收敛于某一个点了

动图来了:
在这里插入图片描述

听他们说这是数学分析里面的内容,但是由于我们只是学习了高数就没了的,对这方面的知识不够,所以数学还是重要的啊,有时候数学不是不重要,是你没想到能够用上它。

所以这道题的代码就是这样子写了

package Leetcode;
/**
*@time 2020年5月8日:上午11:16:06
*@author Weirdo
*@version 1.0
**/
public class N69 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	int a;

	public int mySqrt(int x) {
		
		a=x;//假设我们开方之后的值就是x本身,让他自动收敛
		
		if(x==0)
			return 0;
		return (int)sqrt(x);

		
    }
	
	private double sqrt(double x) {
		double res = (x+(a/x))/2;
		if(res==x) {
			return x;
		}else {
			return sqrt(res);
		}
	}
}

leetcode题解原文:牛顿迭代法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值