函数
1.1函数的概念
为什么需要用函数?
首先看一下输出100所有素数问题的解决方案
方案一:循环的嵌套
for(var n=2; n<100;n++) {
var flag = false;
var m = Math.ceil(Math.sqrt(n));
for (var i=2; i<=m; i++) {
if (n % i == 0) {
flag = true;
break;
}
}
if(!flag){
document.write(n+"是素数</br>")
}
}
这种解决方案程序比较复杂,阅读也比较困难,需要比较高超的技术。
方案二:应用函数
/*
* 假设系统提供了一个判断素数的函数isPrime(x),那么问题是不是就特别简单
* */
for(var n=2; n<=100; n++){
if(isPrime(n)){
document.write(n+"<br>");
}
}
function isPrime(num){
var m = Math.ceil(Math.sqrt(num));//根据相关数学定理,查找范围可缩小[2,m]
for(var factor=2; factor<=m; factor++){//遍历找出所有符合的因子
if(num%factor ==0){
return false;
}
}
return true;
}
这种解决方案是将一个比较复杂的问题分解为两个比较简单的问题去解决,是用“量”去克服“难”和“大”的问题。也就是“大事化小”。
这种解决方案给我们提供了一个解决规模大、难度高的问题的解决思路:将它分解为多个规模相对较小、难度相对较低的问题去解决,如果分解后的问题仍然规模大或者难度高,可以按照这个思路一直分解下去,直到分解后的问题足够小、简单。归纳起来就是“大事化小”。
1.2定义与调用
函数是什么,怎么用?
定义:
function isPrime(n){
..............
}
function 定义函数的关键字
isPrime 是函数的名字,和变量名一样的命名规则和原则
n 形式参数(形参)
isPrime(12),12就是实际参数(实参)
函数头部:体现的是函数的设计
函数体:体现的是函数的实现过程
设计比实现更重要
案例:验证100以内的数都符合角谷定理
/*
* 验证100以内的数都符合角谷定理
* 功能:判断一个给定的数是否符合角谷定理
* 名称:isJiaogu
* 输入参数:待判断的数
* 输出结果:true or false
* */
var flag = true;
for(var n=2; n<=100; n++){
if(!isJiaogu(n)){
flag = false;
}
}
alert("角谷定理验证"+flag?"成功":"失败");
function isJiaogu(num) {
while (num != 1) {
if (num % 2 == 0) {
num /= 2;
} else {
num = num * 3 + 1;
}
}
return true;
}
案例:验证10000以内哥德巴赫猜猜成立
思路与代码:
<script>
/*
* 验证10000以内哥德巴赫猜猜成立
*
* 假设系统有一个函数能帮助我们判断大于6的偶数能否分解的
* 设计一下该函数
* */
/*
* 功能:判断一个数能否分解为两个素数之和
函数名:canSplit
输入参数:待分解的数
返回结果:true、false
* */
var flag = true;
for(var n=6; n<=10000; n+=2){
if(!canSplit(n)){
flag = false;
break;
}
}
alert("哥德巴赫猜想"+ (flag?"成立":"不成立"));
/*
* 那么如何实现这个函数呢,好像还是不够简单,那就继续分
* 如果系统有一个能判断素数的函数,那这个问题也简单
* 设计
* 功能:判断一个数是否为素数
* 名称:isPrime
* 输入参数:待判断的数
* 输出结果:true、false
* */
function canSplit(n){
for(var i=2; i<=n/2;i++){
if(isPrime(i)&&isPrime(n-i)){
return true;
}
}
return false;
}
function isPrime(num){
var m = Math.ceil(Math.sqrt(num));//根据相关数学定理,查找范围可缩小[2,m]
for(var factor=2; factor<=m; factor++){//遍历找出所有符合的因子
if(num%factor ==0){
return false;
}
}
return true;
}
</script>
从案例中发现,运用了上面的“大事化小”之后就变的很容易了。
函数的本质:直观理解就是实现某个独立功能的代码段,或者说它就是一个数据加工的黑箱子。
所谓“黑箱子”,就是我们只关心外面的东西,比方说它是干啥的,需要输入什么,可以得到什么结果,而不关心里面是怎么工作的。
忽略实现细节