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