这是我的示例函数。
let array = ["x", "y", "z", 4, 5];
function print(arr, pos, len) {
if (pos < len) {
console.log(arr[pos]);
print(arr, pos + 1, len);
}
return;
}
print(array, 0, array.length);
数组逐个打印。但是,这是怎么回事呢?有人澄清这里的功能过程吗?
答案 0 :(得分:2)
这是怎么回事?
它正在使用 recursion ,这意味着该函数本身是从函数内部调用的。使用循环不是迭代集合的唯一方法。
如果您查看代码,则print
函数在函数外部会被调用一次,但也会在print
函数本身内部被调用。因此,当我们第一次使用数组[1, 2, 3]
运行您的函数时,我们使用以下参数运行该函数:
print([1, 2, 3], 0, 3)
然后,当我们输入函数时,我们查看if
语句,发现pos
(0)实际上小于len
(3)。因此,我们继续进行console.log(arr[0])
,它将打印您数组中的第一项。
然后我们继续下一行,并再次调用print
,但这一次是从函数内部进行的。现在,我们使用以下参数来调用它:
print([1, 2, 3], 1, 3)
这将再次遍历if
语句,看看它是正确的,然后运行
console.log(arr[1])
会再次使用以下参数调用print
:
print([1, 2, 3], 2, 3)
然后它将console.log(arr[2])
(数组中的最后一项)并再次使用以下参数调用print
:
print([1, 2, 3], 3, 3)
,但是,这一次我们的if
语句不满足/不正确,因为pos
(3)不小于len
(3)。换句话说,我们的基本情况(停止递归的条件)已得到满足。因此,我们要做的不是打印,就是return
。
执行return
将使我们返回到上一次调用print
语句的位置,这意味着我们将从先前对{{1 }},然后在if
语句完成后再次print
。展开过程一直持续到我们return
最初调用if
为止。之后,我们的程序将终止,因为没有更多的代码可运行。
答案 1 :(得分:1)
函数直接或间接调用自身的过程是 称为递归,相应的功能称为递归 功能
在您的情况下,这意味着从其函数体内多次调用print
以打印数组内容。
let array = ["x", "y", "z", 4, 5];
function print(arr, pos, len) { // <-- notice current position is passed as parameter
if (pos < len) { // <-- keep doing it until end of the array
console.log(arr[pos]); // <-- prints to the console the value at current position
print(arr, pos + 1, len); // <-- print function is called again with dif. pos!
}
return;
}
print(array, 0, array.length); // <-- call the print function with 0 and 5 as parameters
答案 2 :(得分:1)
这是一个递归函数:
阅读博客简单而有效:click Here