【葡京手机】n之间总是个整数之和,近年来收看的JS再次回到函数的一部分题

JS重回值题平素都以洞察注重,面试和笔试之中也时不时提到到,说一说笔者近日碰着的有的风趣的JS重返函数难点。

今日面试遇到三个机试题目,用JS落成1+2+3+……+100=?,完结方式有无数,那么大家深度考虑一下,如何用JS完结求m~n之间连接个整数之和?

前边看来过一道风趣的主题材料,说有三个sum函数,用户能够经过sum(2,3)来取到2+3
= 5
的结果,不过有的用户会冒出失误的操作,有希望错误的写成sum(2)(3),未来供给加码客户的容错率,让sum(2)(3)也能够正确的归来结果。

率先,对于导语里面包车型地铁机试标题:用JS达成1+2+3+……+100=?

思路:sum(2,3)便是函数字传送入了三个参数2和3然后能够回到2+3以此结果,而sum(2)(3)则是传播2随后获得二个结实,然后再一次传来3最后收获2+3那些准确结果,也等于说函数要多奉行一回,由此若是传入2就要再次回到三个函数,这里能够这么写:

自己用的是for循环方法去求和,代码如下:

 

var x = 0;

function sum(num1,num2)
{
    if(num2 == undefined){
        return function(num){
            return num1 + num;
        }
    }else{
        return num1 + num2;
    }
}

console.log(sum(2,3)); //5
console.log(sum(2)(3)); //5


还有一道比较有意思的问题是说once这个只执行一次的函数,题目要求传入一个函数对它进行包装,要求返回的结果不管执行几次只会返回第一次的结果。例如:

g = once(func);
g(2); //func(2)的结果
g(3); //还是func(2)的结果

思路:这道题不用说肯定需要一个全局变量来判断函数时候执行过,需要一个数据来存放第一次执行的结果,根据前一个变量来判断是否执行过,如果没有执行后返回结果,如果执行过则不需要再次执行,直接返回第一次的结果。这题一个考察点是全局变量的控制,还有一个考察点就是怎么利用这个传入的func来得到结果。话不多说,直接上代码:

function fn(num)
{
    return num*num;
}
function once(func)
{
    if(typeof func != "function"){
        alert("请传入函数类型");
    }
    flag =true;
    window.result;
    return function() {
        if (flag) {
            result = func.apply(this, arguments);
            flag = false;
            return result;
        } else {
            return result;
        }
    }
}

g = once(fn);
console.log(g(2)); //4
console.log(g(3)); //4

这里注意运用apply传入arguments来调用func,arguments是一个function特有的属性,表示的是传入的所有参数,是一个类数组但不是真正意义上的数组,如果想将它转换成数组可以使用:

Array.prototype.slice.call(arguments);

这里还要说一下关于apply的相关知识,函数一般改变this上下文有三种方法:call()、apply()和bind()
call()和apply()差不多,如果都是传入一个参数的话它俩是一样的,如果传入多个参数,apply(this,arr)的第二个参数是一个数组,也就是你需要传入的各个参数组成的数组,而call(this,a,b)后面跟的是需要传入的各个属性。这两个最后得到的是改变this之后函数的执行结果。
bind()是ES5中加入的一个方法这个是直接将一个对象绑定到函数中,返回一个新的函数,这个函数里面的this属性会始终指向绑定的对象。

for(var i = 0;  i <= 100;  i++) {

x += i;

}

console.log(x);    //结果为5050

实际上还会有其余的消除办法,比如说递归。

在用代码达成以前,首先来讲说怎么是递归。

多个历程函数在其定义或注解中有直接或直接调用本人的一种办法。

——援用自百度百科《递归》

递归函数正是直接或直接调用本人的函数,也正是本人调用自个儿。

——援引自百度百科《递归函数》

村办精晓:递归便是先后调用本人不断深刻嵌套,直到满意条件退出的一种算法。

那么地点机试标题用递归方法完成正是:

function sum(x) {

if(x < 2) {

return 1;

}

else {

return x + sum(x – 1);

}

}

sum(100);    // 结果为5050;

事实上下边包车型客车代码还以简化一下:

function sum(x) {

return x < 2? 1 : x + sum(x – 1);

}

sum(100);    // 结果为5050

此间的函数sum其实正是贰个递归函数,这么些函数以后能够总计1+2+3+……+n的值,我们只供给把n作为参数字传送入到sum就足以得出结果。

实现进程正是当我们传入参数100时,函数sum会再次来到100 + sum(100 –
1)的值,那年又调用了函数本人,那么就能没完没了重复那几个相加的长河,直到参数x
< 2,就退出那一个递归进程,并回到最后加上1的和值。

这就是说大家前几天把标题难度升高一下,若是以往有m~n个延续整数,首项为m,末项为n。总结m+(m+1)+(m+2)+……+n=?

这正是说地点递归方法的代码就要修改一下:

function sum(m, n) {

if(n == m) {

return m;

}

else {

return n + sum(m, n – 1);

}

}

sum(1, 100);    // 结果为5050

那么还或者有未有其余格局呢?其实大家还足以动用等差数列求和公式。

首先来复习下高级中学求学的数学知识:

等差数列:

an=a1+(n-1)d

前n项和公式为:Sn=na1+n(n-1)d/2

若公差d=1时:Sn=(a1+an)n/2

若m+n=p+q则:存在am+an=ap+aq

若m+n=2p则:am+an=2ap

如上n均为正整数

翻译成文字表达:

第n项的值an=首项+(项数-1)×公差

前n项的和Sn=首项+末项×项数(项数-1)公差/2

公差d=(an-a1)÷(n-1)

项数=(末项-首项)÷公差+1

数列为奇数项时,前n项的和=中间项×项数

数列为偶数项,求首尾项相加,用它的和除以2

等差中项公式2an+1=an+an+2里边{an}是等差数列

葡京手机 1

上边的公式大家用JS代码完毕如下:

function Sn(a, n, d) {

return n*a + (n*(n – 1) / 2)* d;

}

Sn(1, 100, 1);    //结果为5050

没有错便是如此轻巧。当然上边的代码假设想更宏观的话还须要投入一些证实。

要是大家对算法熟练,那么在一般的编制程序专门的学业中便能一箭双雕。

参照他事他说加以考察文献及资料:

百度百科《递归》、《递归函数》及《等差数列》

若果您在本文中开采错误也许有争议的地方,能够在商量区留言,谢谢!