8.2迭代
迭代法也叫辗转法
规律:可以不断的用旧的值得到新的值,直到我们想要的结果
遇到了迭代问题怎么解决:
(1)找到迭代变量(旧的值)
(2)确定迭代问题
(3)知道想要的结果是什么(结束循环得条件);
(4)
就是知道最终的结果
循环的次数
/*求最大公约数*/
/*
* 22 54
* */
/*
* (1)接收用户输入的两个数
* (2)一个函数得到最大公约数
* (3)打印这个最大公约数
*
*
* */
var num1 = Number(prompt("输入一个数"));
var num2 = Number(prompt("输入一个数"));
var result = GCD(num1,num2);
alert(result);
var sum = 0;
/*
* 函数的功能
* 函数名:GCD
* 函数的参数:两个整数
* 返回值:最大公约数
* */
/*
* 如果num<num2则交换,确保num1是较大的
* 计算余数
* 如果余数不为0,重复以下步骤:
* num2 => num1,
* 余数 =>num2
* 重新计算余数
* 最终得到的最大公约数,也就num2的值
* */
function GCD(num1,num2){
if(num1<num2){
sum=num1;
num1=num2;
num2=sum;
}
var remainer=num1%num2;
while(remainer !=0 ){
num1 = num2;
num2 =remainer;
remainer = num1%num2;
}
return num2;
}
8.3递推
找到数学规律,通过公式计算到下一项的值。一直到我们要的结果为止
例如:兔子产子:通过前两项得到下一项
* 接收用户输入的月份
* 计算兔子的对数
* (1)如果经过的月份<2那么兔子的对数为为1
* (2)否则 用初始的兔子的对数加上第一月的对数为第二月兔子的个数(an+1 = an + an-1)
* 反复使用这个公式计算出下个月兔子的个数一直到用户输入的月份为止
* 打印兔子的对数
* */
var month = Number(prompt());
var rabbit = [1,1];
for(var m=2; m<=month; m++){
rabbit[m]=rabbit[m-1]+rabbit[m-2];
}
alert(rabbit[month]);
递推分为顺推和逆推
穷举
遇到一个问题找不到数学公式或规律使用最“笨”的办法,利用计算机速度快的特点,将所有的可能性全部列举出来并将我们得到的结果都记录下来
例如百钱买百鸡
for(var cock=0; cock<=20; cock++){
for(var hen=0; hen<=33; hen++){
var chicken=100-cock-hen;
if(100 == cock*5+hen*3+chicken/3){
document.write("鸡翁一共"+cock+"鸡母一共"+hen+"小鸡一共"+chicken);
}
}
}
穷举方法的特点是算法简单,相应的程序简单,但计算量往往很大,但计算机的优势就是运算速度快,算法可以扬长避短往往取得不错的效果。
8.5递归
所谓的递归,就是在函数内部又去调用自己。
例如,求阶乘问题,在fact函数内部又去调用了fact函数
function fact(n){
if(1 == n){
return 1;
}
return n*fact(n-1);
}
alert(fact(5));
递归算法如果按照常规思路去理解是非常复杂的,函数调用一层一层嵌套调用,然后又一层一层返回。不妨换个思路去理解递归。
递归实际上就是将规模为n的问题降价为n-1的问题进行求解,也就是去找n和n-1之间的关系。