什么是函数?
函数是可以完成某个独立功能的代码,比方下面的代码段就是完成判断素数的功能
private static boolean isPrime(int n) {
boolean flag= true;
for (int a = 2; a <n; a++) {
if(n % a == 0) {
flag = false;
break;
}
}
returnflag;
}
}
形式参数:在定义函数时给的参数叫做形式参数,参数叫什么名字与功能无关,当然需要遵循见名思义的原则。
实际参数:在调用函数是给的参数叫做实际参数,实参在调用时必须具有的值。
为什么需要函数呢?
将大的、复杂的问题分解成若干个小的、简单的问题去求解,能有效地帮助我们轻松解决复杂问题。
案例:验证哥德巴赫猜想
文档化注释
在函数上方输入/** 回车即可
好处:不用打开代码
函数的本质是什么?
函数就是一个加工的黑箱子,我们不应关注它的内部实现细节,而是关注它的的外部信息,比如这个箱子是干什么的(功能)、需要给他什么(参数)以及它可以得到什么结果(返回值)
对于程序员来讲,更重要的是函数的设计,而不是实现。
函数设计三要素
(1) 函数名:见名思义,也就是根据功能定名字
(2) 参数:考虑要实现这个功能,需要外部提供什么。
(3) 预期结果:(类型)如果函数正确执行,应该得到的结果的类型,切记,设计函数只需要回答三要素是什么,不能去考虑如何实现,或者说代码怎么写!
案例:亲密数对
public class E201_06_07_判断是否为亲密数对 {
publicstatic void main(String[] args) {
for (int a =2;a<=10000;a++){
intb = sum0fFact(a);
if(sum0fFact(b)==a && a>b){
System.out.printf("%d和%d是亲密数对\n",a,b);
}
}
}
privatestatic int sum0fFact(int n) {
int sum=1;
for (int i = 2;i<=n/2;i++){
if(n%i==0){
sum += i;
}
}
returnsum;
}
案例:哥德巴赫的改进
将原来的函数判断能否分解的函数改造成分解函数,其返回值表达的含义有两层:
(1) 能否分解
(2) 怎么分
难题:return只能返回一个数,但是根据上面的要求需要返回三个数,怎么办?
有人提出在分解函数中同时进行输出,如下面代码
private static boolean canSplit(int n){
int i= 0;
for (int m = 3;m<n/2;m+=2){
if(isPrime(m)&&isPrime(n-m)){
System.out.printf("%d=%d+%d\n",n,m,n-m);
returntrue;
}
}
returnfalse;
}
这种做法不好,理由:
(1) 函数的功能要尽量单一,不要将多个功能揉在一起。
(2) 如果在函数直接进行输出,可能会导致这个函数的可重用性变差,比如你用中文输出,那外国程序员就没办法用你的函数了。