当这块js代码运行时会发生什么?

时间:2015-05-11 09:27:28

标签: javascript

这个javaScript代码块让我发疯,它是如何进行计算的。我尝试用计算器手动完成,但结果在4处开始不同。请解释一下你是否知道如何

function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}


if i run console.log(fac(1));

// > 1

if i run console.log(fac(2));

// > 2

if i run console.log(fac(3));

// > 6

我在想这就是

背后发生的事情
(2-1) * 2 = 2, 
(3-1) * 3 = 6, 

直到我把

(4-1) * 4 = 12.

if i run console.log(fac(4)); the output is 24 not 12  


// > 24 how and why?

欢呼声

2 个答案:

答案 0 :(得分:1)

正在对同一个函数执行递归函数调用。

<script type="text/javascript">
            var divs = document.getElementsByClassName('mtime');
            [].slice.call(divs).forEach(function (div) {

                var date = div.InnerHTML;
                var newDate = new Date(date.getTime() + date.getTimezoneOffset() * 60 * 1000);

                var offset = date.getTimezoneOffset() / 60;
                var hours = date.getHours();

                newDate.setHours(hours - offset);
                div.InnerHTML = newDate;

            });


        </script>

    </body>
  • function fac(n) { if (n == 0) return 1; else return fac(n - 1) * n; } fac(4); 的值为4.因此它应返回n。现在fac(4 - 1) * 4)在返回值之前计算。
  • fac(4 -1)的值为3.现在它将返回n,它将替换先前语句中的fac(3 - 1) * 3)。因此,它将成为fac(4 - 1)
  • fac(3 - 1) * 3 * 4的值为2.现在它将返回n,它将替换先前语句中的fac(2 - 1) * 2)。因此,它将成为fac(3 - 1)
  • fac(2 - 1) * 2 * 3 * 4的值为1.现在它将返回n,它将替换先前语句中的fac(1 - 1) * 1)。因此,它将成为fac(2 - 1)
  • fac(1 - 1) * 1 * 2 * 3 * 4的值为0.现在它将返回n,它将替换先前语句中的1。因此,它将成为fac(1 - 1)

如您所见,您可以通过将代码更改为

来避免乘以1 * 1 * 2 * 3 * 4两次
1

简而言之,

function fac(n) {
    if (n == 1)
        return 1;
    else
        return fac(n - 1) * n;
}

答案 1 :(得分:0)

这是一个因素。它计算了具有n个元素的集合的所有排列。或者更简单:

  

[factorial]是小于或等于n的所有正整数的乘积。

Wikipedia:Factorial

注意到n!。例如:

1! = 1 
2! = 1 * 2 = 2
3! = 1 * 2 * 3 = 6
4! = 1 * 2 * 3 * 4 = 24

函数正在做的是以递归方式调用自身。执行函数fac(4)时,会发生以下情况:

fac(4),自4 != 0起,返回的值为fac(4 -1) * 4。但是,由于return函数包含对函数的引用,因此我们等待它返回一个值。

fac(3)(即fac(4-1)),自3 != 0起,返回的值为fac(3-1) * 3。但是同样的事情发生了,我们等待fac(3-1) / fac(2)的结果。

fac(2)fac(3-1)2 != 0),fac(2-1) * 2返回的值为fac(1)。同样,因为我们正在调用一个函数,所以我们等待它返回,直到我们继续进行计算。

fac(2-1) 1 != 0fac(1-1)* 1}返回的值为fac(1-1),我们推迟fac(0)返回结果。

fac(1-1)(即0==0)自fac(1)后我们返回值为乘法的中性值。

fac(1-1)中,fac(1)变为一个,因此1*1值变为1fac(2)

fac(2-1)中,1fac(2)取代,因此1*2变为2fac(3)

fac(3-1)中,2替换为fac(3)2*3变为6fac(4)

fac(4-1)中,6重新fac(4)6*4变为24<input id="btn" type="button" value="click" /> function myFunction() { $('.ajax-popup-link').magnificPopup({ type: 'ajax', overflowY: 'scroll', closeOnContentClick: false }); } $(document).ready(function() { $("#btn").click(myFunction); });