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