数学是一门工具性很强的科学,具有较高的抽象性,随着人工智能、GPS(全球定位系统)等飞速的发展和计算机运算性能飞跃性的提升,计算机的优势越来越深入到思维领域,计算机将高深的数学理论用到实际中来,十分有效地解决了许多实际问题,如著名难题四色问题就是被计算机证明的。如分析几何、小波分析、离散数学、仿生计算、数值计算中的有限单元方法等。它让人们知道计算机程序设计结合的就是数学知识和数学思想。
算法与数学之美
今天的故事让我们从力扣(LeetCode)的一个问题开始:
手写实现一个int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
相信很多人第一眼看到这个题目的时候,都跟杠宝一样,想用二分法去解,而二分法也确实能够有效的解决这个问题,但是今天咱们的重点不是这个,所以这里就不多深入,文末会附上二分法的解题Java实现
话不多说,让我们直接进入今天的主题"牛顿迭代法",首先普及一下牛顿法的概念和基本思想:
概念:牛顿法(英语:Newton's method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。https://zh.wikipedia.org/zh.wikipedia.org
基本思想:在迭代过程中,以直线代替曲线,用一阶泰勒展式(即在当前点的切线)代替原曲线,求直线与 x 轴的交点,重复这个过程直到收敛。
那我们该如何将牛顿法应用到我们的程序中呢,别急,让我们回到最初的这个题目,以求平方根为例,我们先通过牛顿法得到他的求值函数,然后建立我们的软件编程解决问题模型:
得到我们的迭代函数之后,开始编程,我们的代码就变得格外的简单咯⬇️
class Solution2 {
int s;
public static void main(String[] args) {
System.out.println(new Solution2().mySqrt(2));
}
public int mySqrt(int x) {
s=x;
if(x==0){
return 0;
}
return ((int)(sqrts(x)));
}
public double sqrts(double x){
double res = (x + s / x) / 2;
if (res == x) {
System.out.println(res);
return x;
} else {
return sqrts(res);
}
}
}
控制台输出:
1.414213562373095
1
由于题目中返回是int,所以我们直接丢弃掉小数部分就好,显而易见,运用一些数学知识能让我们的代码更加简洁高效!
总结:
- 软件编程是基于数学模型的基础上面的,所以,数学是计算机科学的主要基础,软件编程中不仅许多理论是用数学描述的,而且许多技术也是用数学描述的。从计算机各种应用的程序设计方面考察,任何一个可在存储程序式电子数字计算机上运行的程序,其对应的计算方法首先都必须是构造性的,数据表示必须离散化,计算操作必须使用逻辑或代数的方法进行,这些都应体现在算法和程序之中。
- 软件编程的思想最重要是算法,而算法是建立在数学思维上的,其实说白了,程序只是一件衣服,算法才是它的灵魂,算法就来自于数学,没有深厚的数学思维功底,很难弄懂算法。所以,如果你想从事软件编程并有深入的打算,那么就认真的培养自己的数学思维吧!
附二分法解决方法:
public class Solution {
public int mySqrt(int x) {
long left = 0;
long right = Integer.MAX_VALUE;
while (left < right) {
// 这种取中位数的方法又快又好,是我刚学会的,原因在下面这篇文章的评论区
// https://www.liwei.party/2019/06/17/leetcode-solution-new/search-insert-position/
// 注意:这里得用无符号右移
long mid = (left + right + 1) >>> 1;
long square = mid * mid;
if (square > x) {
right = mid - 1;
} else {
left = mid;
}
}
return (int) left;
}
}
链接:https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liweiw/
本文首发于公众号:<山水一程丿指路为码>
参考链接: https:// leetcode-cn.com/problem s/sqrtx https:// blog.csdn.net/FnqTyr45/ article/details/78146272 https:// zh.wikipedia.org/wiki/% E7%89%9B%E9%A1%BF%E6%B3%95