牛顿下山法通用程序_浅谈牛顿迭代法与编程

47ccaa71e59720c99531a94d1e54e565.png
数学是一门工具性很强的科学,具有较高的抽象性,随着人工智能、GPS(全球定位系统)等飞速的发展和计算机运算性能飞跃性的提升,计算机的优势越来越深入到思维领域,计算机将高深的数学理论用到实际中来,十分有效地解决了许多实际问题,如著名难题四色问题就是被计算机证明的。如分析几何、小波分析、离散数学、仿生计算、数值计算中的有限单元方法等。它让人们知道计算机程序设计结合的就是数学知识和数学思想。
算法与数学之美

今天的故事让我们从力扣(LeetCode)的一个问题开始:

手写实现一个int sqrt(int x) 函数。
    计算并返回 x 的平方根,其中 x 是非负整数。
    由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
  输入: 4
  输出: 2
示例 2:
  输入: 8
  输出: 2
  说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

相信很多人第一眼看到这个题目的时候,都跟杠宝一样,想用二分法去解,而二分法也确实能够有效的解决这个问题,但是今天咱们的重点不是这个,所以这里就不多深入,文末会附上二分法的解题Java实现

话不多说,让我们直接进入今天的主题"牛顿迭代法",首先普及一下牛顿法的概念和基本思想:

概念:牛顿法(英语:Newton's method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。
基本思想:在迭代过程中,以直线代替曲线,用一阶泰勒展式(即在当前点的切线)代替原曲线,求直线与 x 轴的交点,重复这个过程直到收敛。
https://zh.wikipedia.org/​zh.wikipedia.org

d3d0afba1f386796e647fb1a7a9d2591.gif

那我们该如何将牛顿法应用到我们的程序中呢,别急,让我们回到最初的这个题目,以求平方根为例,我们先通过牛顿法得到他的求值函数,然后建立我们的软件编程解决问题模型:

da03ed722bb376b207f341fd73c9170d.png
图作者:liweiwei1419

得到我们的迭代函数之后,开始编程,我们的代码就变得格外的简单咯⬇️

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值