JS | freecodecamp刷题第二天
递归是函数调用自身的操作。 为了便于理解,有如下任务:计算数组内元素前 n 的元素乘积。 使用 for 循环, 可以这样做:
function multiply(arr, n) { var product = 1; for (var i = 0; i < n; i++) { product *= arr[i]; } return product; }
下面是递归写法,注意代码里的 multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1]。 这意味着可以重写 multiply 以调用自身而无需依赖循环。
function multiply(arr, n) { if (n <= 0) { return 1; } else { return multiply(arr, n - 1) * arr[n - 1]; } }
递归版本的 multiply 详述如下。 在 base case 里,也就是 n <= 0 时,返回 1。 在 n 比 0 大的情况里,函数会调用自身,参数 n 的值为 n - 1。 函数以相同的方式持续调用 multiply,直到 n <= 0 为止。 所以,所有函数都可以返回,原始的 multiply 返回结果。
注意: 递归函数在没有函数调用时(在这个例子是,是当 n <= 0 时)必需有一个跳出结构,否则永远不会执行完毕。
2.随机数
a. Math.random() 生成一个随机小数。
b. Math.floor() 向下取整
综合: 返回一个在 myMin(包括 myMin)和 myMax(包括 myMax)之间的随机整数
parseInt() 函数解析一个字符串返回一个整数
parseInt(string, radix); radix 表示 string 是在二进制系统中
3. 递归
写一个递归函数,返回一个数字 1 到 n 的连续数组。 这个函数需要接收一个参数 n 代表最终数字。 然后会持续的调用自身,传入一个比 n 更小的值一直到传入的值是 1 为止。 函数如下:
function countup(n) { if (n < 1) { return []; } else { const countArray = countup(n - 1); countArray.push(n); return countArray; } } console.log(countup(5));
值 [1, 2, 3, 4, 5] 将显示在控制台中。
起初,这似乎是违反直觉的,因为 n 的值递减,但是最终数组中的值却递增。 之所以发生这种情况,是因为在递归调用返回之后,才调用 push。 在将 n pushed 进数组时,countup(n - 1) 已经调用赋值成功并返回了 [1, 2, ..., n - 1]。
已经定义好了 rangeOfNumbers 函数,包含两个参数。 函数应该返回一个连续数字数组,startNum 参数开始 endNum 参数截止。 开始的数字小于或等于截止数字。 函数必需递归调用自身,不能使用任意形式的循环。 要考虑到 startNum 和 endNum 相同的情况。
function rangeOfNumbers(startNum, endNum) { if(endNum < startNum){ return []; }else{ const rangeArray = rangeOfNumbers(startNum ,endNum - 1); rangeArray.push(endNum); return rangeArray; } }; console.log(rangeOfNumbers(1, 5))

浙公网安备 33010602011771号