Code前端首页关于Code前端联系我们

js实现的递归算法,字段长度为5,元素随机数为2-32之间的非重复值

terry 2年前 (2023-09-09) 阅读数 204 #Javascript
文章标签 JavaScript

问题

这是一个大题,考点分为4个小项;侯选人需要使用递归算法来实现(限15行代码完成;限时10分钟内完成)

  • 生成长度为 5 的空数组 arr。
  • 生成 (2-32) 之间的随机整数。
  • 在arr字段中放入rand随机数。如果arr中已经存在与rand相同的数字,则生成随机rand数并放入arr中【需要递归实现,不能使用for/while循环】
  • 最后写入长度为5、不重复内容的数组arr。

我的实现方法

 函数 randomNumber(arr){
    var value = Math.floor(Math.random()*31+2);
    if(~arr.findIndex(item=>item==value))return randomNumber(arr);
    返回值;
}
函数 nArr(长度,arr){
    var arr = typeof arr== '未定义'? new Array(length):arr;
    var index = arr.findIndex(item=>item==undefined);
    if(!~index) 返回 arr
    arr[索引]=随机数(arr);
    返回 nArr(长度,arr);
}

从错误中学习

Math.floor(Math.random()*31+2);这个写法不严谨,我学会了(●'◡'●)

要获取范围值,您应该这样写:

Math.floor(Math.random() * (max - min + 1)) + min;

原因如下:

//生成2 - 5范围内的随机数
变量最小值 = 2,最大值 = 5;
var 结果 = Math.max(min, Math.ceil(Math.random() * max));// 参数一 p1 始终等于 2
// 参数两个p2在[0, 5]之间具有相同的值
// 请参阅下面的选项
//p1 2 2 2 2 2 2
// p2 0 1 2 3 4 5
// 结果 2 2 2 3 4 5

可见结果2的概率大于3/4/5。

其他人实现目标的方法

看到了一个比较优雅的代码,代码实现是这样的:

//完成6行
函数 buildArray(arr, 长度, 最小值, 最大值) {
    var num = Math.floor(Math.random() * (max - min + 1)) + min;
    if (!arr.includes(num)) { arr.push(num); }
    返回 arr.length === 长度 ? arr : buildArray(arr, 长度, 最小值, 最大值);
}
var 结果 = buildArray([], 5, 2, 32);
console.table(结果);

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门