这个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?
欢呼声
答案 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的所有正整数的乘积。
注意到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 != 0
后fac(1-1)* 1
}返回的值为fac(1-1)
,我们推迟fac(0)
返回结果。
fac(1-1)
(即0==0
)自fac(1)
后我们返回值为乘法的中性值。
在fac(1-1)
中,fac(1)
变为一个,因此1*1
值变为1
或fac(2)
。
在fac(2-1)
中,1
被fac(2)
取代,因此1*2
变为2
或fac(3)
。
在fac(3-1)
中,2
替换为fac(3)
,2*3
变为6
或fac(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);
});
。