【从浅到深的算法技巧】4.静态方法
1.1.6静态方法
在许多语言中,静态方法被称为函教,静态方法是一组在被调用时会被顺序执行的语句。修饰符static将这类方法和1.2的实例方法区别开来。当讨论两类方法共有的属性时我们会使用不加定语的方法一词。
1.1.6.1静态方法
方法封装了由一系列语句所描述的运算。方法需要参数(某种数据类型的值)并根据参数计算出某种数据类型的返回值(例如数学函数的结果)或者产生某种副作用(例如打印一个值)。BinarySearch 中的静态函数rank()是前者的一个例子; main()则是变量后者的一个例子。 每个静态方法都是由签名(关键字public static以及函数的返回值,方法名以及一串各种类型的参数)和函数体(即包含在花括号中的代码)组成的。
典型静态方法的实现
任务 | 实现 |
---|---|
计算一个整数的绝对值 | public static int abs(int x) { if (x<0) return -x;else return x; } |
计算一个浮点数的绝对值 | public static double abs(double x) { if (x < 0.0) return -x; else return x; } |
判定一个数是否是素数 | public static boolean isPrime(int N){ for (int=2; i*i <= N; i++) for(N%i ==0) return false; return true; } } |
计算平方根(牛顿迭代法) | public static double sqrt(double c){ if (c <0) return Double. NaN; double err=le -15; while (Math.abs(t - c/t) > err*t) return t; } |
计算直角三角形的斜边 | public static double hypotenuse(double a, double b){ return Math. sqrt(a* a + b*b); } |
1.1.6.2调用静态方法
调用静态方法的方法是写出方法名并在后面的括号中列出参数值,用逗号分隔。当调用是表达式的一部分时,方法的返回值将会替代表达式中的方法调用。例如,BinarySearch 中调用rank()返回了一个int值。仅由一个方法调用和一个分号组成的语句一般用于产生副作用。例如,BinarySearch 的main()函数中对系统方法Arrays . sort()的调用产生的副作用,是将数组中的所有条目有序地排列。调用方法时,它的参数变量将被初始化为调用时所给出的相应表达式的值。返回语句将结束静态方法并将控制权交还给调用者。如果静态方法的目的是计算某个值,返回语句应该指定这个值(如果这样的静态方法在执行完所有的语句之后都没有返回语句,编译器会报错)。
1.1.6.3方法的性质
下面是对方法性质的描述:
1.方法的参数按值传递:在方法中参数变量的使用方法和局部变量相同,唯一不同的是参数变量的初始值是由调用方提供的。方法处理的是参数的值,而非参数本身。这种方式产生的结果是在静态方法中改变一个参 数变量的值对调用者没有影响。本书中我们一般不会修改参数变量。值传递也意味着数组参数将会是原数组的别名——方法中使用的参数变量能够引用调用者的数组并改变其内容(只是不能改变原数组变量本身)。例如,Arrays. sort()将能够改变通过参数传递的数组的内容,将其排序。
2.方法名可以被重载:例如,Java的Math包使用这种方法为所有的原始数值类型实现了Math. abs()、Math.main()和Math. max()函数。重载的另一种常见用法是为函数定义两个版本,其中一个需要一个参数而另一个则为该参数提供一个默认值。
3.方法只能返回一个值,但可以包含多个返回语句:一个Java方法只能返回一个值,它的类型是方法签名中声明的类型。静态方法第一次执行到一-条返回语句时控制权将会回到调用代码中。尽管可能存在多条返回语句,任何静态方法每次都只会返回一个值,即被执行的第一条返回语句的参数。
4.方法可以产生副作用:方法的返回值可以是void,这表示该方法没有返回值。返回值为void的静态函数不需要明确的返回语句,方法的最后一条语句执行完毕后控制权将会返回给调用方。我们称void类型的静态方法会产生副作用(接受输入、产生输出、修改数组或者改变系统状态)。例如,我们的程序中的静态方法main()的返回值就是void,因为它的作用是向外输出。技术上来说,数学方法的返回值都不会是void ( Math. random()虽然不接受参数但也有返回值 )。
实例方法也拥有这些性质,尽管两者在副作用方面大为不同。
1.1.6.4递归
方法可以调用自己。例如,下面给出了BinarySearch 的rank()方法的另一种实现。 我们会经常使用递归,因为递归代码比相应的非递归代码更加简洁优雅、易懂。下面这种实现中的注释就言简意赅地说明了代码的作用。我们可以用数学归纳法证明这段注释所解释的算法的正确性。
编写递归代码时最重要的有以下三点。
1.递归总有一个最简单的情况一方法的第一条语句总是一个包含 return的条件语句。
2.递归调用总是去尝试解决一个规模更小的子问题,这样递归才能收敛到最简单的情况。在下面的代码中,第四个参数和第三个参数的差值一直在缩小。
3.递归调用的父问题和尝试解决的子问题之间不应该有交集。在下面的代码中,两个子问题各自操作的数组部分是不同的。
二分查找的递归实现
public static int rank(int key, int[] a){ return rank(key, a, 0, a. length- 1); }public static int rank(int key, int[] a, int 10, int hi){ //如果key存在于a[]中, 它的索引不会小于10且不会大于hiif (lo> hi) return -1;int mid=lo+ (hi - lo) / 2;if(key < a[mid]) return rank( key, a, 10, mid-1);else if (key> a[mid]) return rank(key, a, mid + 1, hi);else return mid;}
1.1.6.5基础编程模型
静态方法库是定义在一个Java类中的一组静态方法。 类的声明是public class 加上类名,以及用花括号包含的静态方法。存放类的文件的文件名和类名相同,扩展名是java。Java 开发的基本模式是编写一个静态方法库(包含一个main()方法)来完成一个任务。输人java和类名以及一系列字符串就能调用类中的main()方法,其参数为由输入的字符串组成的一个数组。main()的最后一条语句执行完毕之后程序终止。 在本书中,当我们提到用于执行一项任务的Java程序时,我们指的是用这种模式开发的代码。例如,BinarySearch就是一个由两个静态方法rank()和main()组成的Java程序,它的作用是将输人中所有不在通过命令行指定的白名单中的数字打印出来。
1.1.6.6模块化编程
这个模型的最重要之处在于通过静态方法库实现了模块化编程。我们可以构造许多个静态方法库(模块),一个库中的静态方法也能够调用另- 个库中定义的静态方法。这能够带来许多好处:
1.程序整体的代码量很大时,每次处理的模块大小仍然适中;
2.可以共享和重用代码而无需重新实现;
3.很容易用改进的实现替换老的实现:
4.可以为解决编程问题建立合适的抽象模型;
5.缩小调试范围
1.1.6.7单元测试
Java 编程的最佳实践之一就是每 个静态方法库中都包含一个 main()函数来测试库中的所有方法(有些编程语言不支持多个main()方法,因此不支持这种方式)。恰当的单元测试本身也是很有挑战性的编程任务。每个模块的main()方法至少应该调用模块中的其他代码并在某种程度上保证它的正确性。随着模块的成熟,我们可以将main()方法作为一个开发用例,在开发过程中用它杂时,我们可能会将它独立成一个模块。
1.1.6.8 外部库
我们会使用来自4个不同类型的库中的静态方法,重用每种库代码的方式都稍有不同。它们大多都是静态方法库,但也有部分是数据类型的定义并包含了一些静态方法。
1.系统标准库java.lang*:这其中包括Math库,实现了常用的数学函数; Integer 和Double库,能够将字符串转化为int和double值; String 和StringBuilder库等等以及其他一些我们没有用到的库。
2.导入的系统库,例如java.utils.Arrays: 每个标准的Java版本中都含有上千个这种类型的库,而且要在程序的开头使用import语句导入才能使用这些库。
要调用另一个库中的方法(存放在相同或者指定的目录中,或是一个系统标准库,或是在类定义前用import语句导入的导库),我们需要在方法前指定库的名称。例如,BinarySearch 的main()方法调用了系统库java.utils.Arrays的sort()方法,我们的库StdIn中的readInts()方法和StdOut库中的println()方法。
含有静态方法的数据类型的定义
//系统标准库DoubleStringStringBuilder//导入的系统库java.utils.Arrays//我们的标准库StdInStdOutStdDrawStdStatsOut
相关文章:
【从浅到深的算法技巧】4.静态方法
1.1.6静态方法 在许多语言中,静态方法被称为函教,静态方法是一组在被调用时会被顺序执行的语句。修饰符static将这类方法和1.2的实例方法区别开来。当讨论两类方法共有的属性时我们会使用不加定语的方法一词。 1.1.6.1静态方法 方法封装了由一系列语句…...
YOLO手部目标检测
手部目标检测原文地址如下:手部关键点检测2:YOLOv5实现手部检测(含训练代码和数据集)_yolov5 关键点检测-CSDN博客 手部检测数据集地址如下: 手部关键点检测1:手部关键点(手部姿势估计)数据集(含下载链接)_手关键点数据集-CSDN博…...
网络IP地址如何更改?怎么使用动态代理IP提高网速?
网络IP地址更改以及使用动态代理IP提高网速的步骤如下: 一、更改IP地址 1. 打开浏览器,输入路由器登陆地址并登陆路由器后台管理界面。 2. 找到“高级设置”或“无线设置”或“VPN设置”一栏,点击“断开”,即可断开网络࿰…...

Flink实时电商数仓之DWS层
需求分析 关键词 统计关键词出现的频率 IK分词 进行分词需要引入IK分词器,使用它时需要引入相关的依赖。它能够将搜索的关键字按照日常的使用习惯进行拆分。比如将苹果iphone 手机,拆分为苹果,iphone, 手机。 <dependency><grou…...
MFC - CArchive/内存之间的序列化应用细节
文章目录 MFC - CArchive/内存之间的序列化应用细节概述笔记END MFC - CArchive/内存之间的序列化应用细节 概述 有个参数文件, 开始直接序列化到文件. 现在优化程序, 不想这个参数文件被用户看到. 想先由参数发布程序(自己用)设置好参数后, 加个密落地. 等用户拿到后, 由程序…...

C语言实验4:指针
目录 一、实验要求 二、实验原理 1. 指针的基本概念 1.1 指针的定义 1.2 取地址运算符(&) 1.3 间接引用运算符(*) 2. 指针的基本操作 2.1 指针的赋值 2.2 空指针 3. 指针和数组 3.1 数组和指针的关系 3.2 指针和数…...
项目——————————
C/C Linux Socket网络编程 TCP 与 UDP_c 语言tcp socket cleint read-CSDN博客C/C Socket - TCP 与 UDP 网络编程_c socket udp-CSDN博客 登录—专业IT笔试面试备考平台_牛客网...

【论文阅读】Realtime multi-person 2d pose estimation using part affinity fields
OpenPose:使用PAF的实时多人2D姿势估计。 code:GitHub - ZheC/Realtime_Multi-Person_Pose_Estimation: Code repo for realtime multi-person pose estimation in CVPR17 (Oral) paper:[1611.08050] Realtime Multi-Person 2D Pose Estima…...

图像分割实战-系列教程9:U2NET显著性检测实战1
🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 U2NET显著性检测实战1 1、任务概述...

RK3568平台 Android13 GKI架构开发方式
一.GKI简介 GKI:Generic Kernel Image 通用内核映像。 Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加…...
阿里云服务器节省计划价格便宜_成本优化全解析
阿里云服务器付费模式节省计划怎么收费?为什么说节省计划更节省成本?节省计划是一种折扣权益计划,可以抵扣按量付费实例(不含抢占式实例)的账单。相比包年包月实例,以及预留实例券和按量付费实例的组合&…...
3种依赖管理工具实现requirements.txt文件生成
1.pip 实现方式 要使用 pip 生成 requirements.txt 文件,可以使用以下命令: pip freeze > requirements.txt这个命令会将当前环境中所有已安装的 Python 包及其版本信息输出到 requirements.txt 文件中。这个文件可以用于共享项目的依赖信息…...
超图iClient3DforCesium地形、影像、模型、在线影像交互示例
超图iClient3DforCesium地形、影像、模型、在线影像交互示例 描述示例代码 描述 数据源:基于iserver发布的三维场景(地形、影像、BIM模型) 在线arcgis影像 应用:目录树展示源数据列表、目录树控制源数据可视化结果显隐、BIM模型点选查询关联属性 示例代…...

【解决】电脑上的WIFI图标不见了咋整?
相信不少同学都遇到过这种情况:电脑上的wifi图标莫名不见了,甚至有时候还是在使用的中途突然断网消失的。 遇到这种情况一般有两种解决方案: 1. 在开机状态下长按电源键30秒以上 这种办法应该是给主板放电,一般应用在wifi6上面。…...

2 - 表结构 | MySQL键值
表结构 | MySQL键值 表管理1. 库的操作2. 表的操作表的创建与删除表的修改复制表 3. 管理表记录 数据类型数值类型字符类型(汉字或者英文字母)日期时间类型 表头存储与日期时间格式的数据枚举类型 数据批量处理 表管理 客户端把数据存储到数据库服务器上…...

Redis(Linux版本7.2.3)
1、停止Redis服务器 [roottssvr1-c1 sysconfig]# ps -ef | grep redis root 322 1 0 10月30 ? 02:58:53 ./bin/redis-server 0.0.0.0:6379 root 32664 12498 0 14:45 pts/0 00:00:00 grep --colorauto redis [roottssvr1-c1 sysconfig]# [roottssvr…...
八股文打卡day18——操作系统(1)
面试题:进程和线程的区别? 我的回答: 1.概念上。进程是系统进行资源分配和调度的基本单位。线程是系统进行运算调度的最小单位。线程是进程的子任务,一个进程至少包含一个线程,一个进程可以运行多个线程,…...

设计模式—行为型模式之模板方法模式
设计模式—行为型模式之模板方法模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 模板方法(Template Metho…...

机器学习的分类与经典算法
机器学习算法按照学习方式分类,可以分为有监督学习(Supervised Learning)、无监督学习(Unsupervised Learning)、半监督学习(Semi-supervised Learning)、强化学习(Reinforcement Le…...

2.3物理层下面的传输媒体
目录 2.3物理层下面的传输媒体2.3.1导引型传输媒体1.双绞线2.同轴电缆3.光纤 2.3.2非导引型传输媒体无线电微波通信 2.3物理层下面的传输媒体 传输媒体是数据传输系统中在发送器和接收器之间的物理通路 两大类: 导引型传输媒体:电磁波被导引沿着固体媒体…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...