用递归给学生评分 - 范围错误

问题描述 投票:0回答:7

我正在尝试解决这个黑客排名问题。

每个学生都会收到包含以下范围内的成绩0-100 至 .

任何低于 38 的成绩均为不及格。 Sam 是大学教授,喜欢根据以下规则对每个学生进行四舍五入:

如果 grade 与下一个倍数之间存在差异 5 小于 3,向上舍入为 5 的下一个倍数。如果grade的值小于38,则不会发生舍入,因为 结果仍然是不及格。

给定 Sam 的每个学生的初始值,编写代码 自动化舍入过程。

我的代码是:

function gradingStudents(grades) {
  const roundup = y => y + 1;
{
   if ( grades < 38 || grades % 5 === 0) return grades;
   else if ( grades % 5 < 4 && grades % 5 !== 0) return roundup(grades);
}
{
   if (roundup % 5 === 0) return roundup;
   else { gradingStudents(roundup + 1) }
}
}

gradingStudents(38) // -> 39

我尝试在变量

roundup
中使用Math.ceil(grades),但输出没有改变。因此,当您使用不早于 5 的倍数(例如 43)的数字调用该函数时,它会返回前面的数字。但是,如果它是 5 的倍数之前的数字,则会出现范围错误。 “已达到最大调用堆栈大小。”

据我所知,代码不会继续到第二部分。即使确实如此,我也不确定在处理第二个块中的 if 语句时是否会获取函数 roundup 的当前值。

我不能进入这里做什么?

另外,这实际上是用于数组输出,但由于我是初学者,所以我对这个开始也非常满意:D 。

javascript algorithm recursion
7个回答
2
投票

Javascript解决方案:

function gradingStudents(grades) {
  return grades.map((grade) => {
    if (grade > 37) {
      const offset = 5 - (grade % 5);
      if (offset < 3) {
        grade += offset;
      }
    }
    return grade;
  });
}

0
投票

试试这个:

function gradingStudents(grades) {  //input: 43
var finalGrade; 
if(grade < 38)              
    return grades;
else{
    var gradeDif = grades % 5; //3
    if(gradeDif > 3){
        return grades;
    }
    else {
        return grades + (5 - gradeDif); //Output: 45

    }
}

}


0
投票

一种解决方案计算不大于成绩的下一个

5
倍数,并使用该值来测试是否向上舍入 (
next5 - grade < 3
)。

我们编写一个简单的函数来对单个成绩进行四舍五入,然后对于成绩列表,使用

.map
与该函数。

const roundGrade = (grade) => {
  const next5 = 5 * Math.ceil (grade / 5)
  return (grade < 38) ? grade : (next5 - grade < 3) ? next5 : grade
}

const gradingStudents = (grades) =>
  grades .map (roundGrade)

console .log (gradingStudents ([73, 67, 38, 33]))

请注意,与此问题的大多数解决方案一样,不需要递归。


0
投票

1-根据问题逻辑使用

Array.prototypt.map

const gradingStudents = (grades) => grades
            .map(n => (n >= 38 && n % 5 >= 3)?(n + ( 5 - ( n % 5 ) )):n )
            
let result = gradingStudents([0,25,38,56,89,77,78,57,58])

console.log(result)


0
投票

我的解决方案是这样的

function gradingStudents(grades) {
    grades.map((grade,i)=>{        
        if(grade >= 38){                
           let fg = (grade/5).toString().split('.');
            if(fg[1]>5){
                grades[i]=((parseInt(fg[0],10)+1) * 5);
            };     
        }
    });
    return grades;
}

console.log(gradingStudents([73,67,38,33]));


0
投票

我的解决方案:

function gradingStudents(grades) {
    return grades.map(function(grade)  {
        return (grade >= 38 && grade % 5 >= 3) ? grade + 5 - (grade % 5) : grade;
    });

}

0
投票

用Python做的,我会接受它是非常基本的,

def gradingStudents(grades):
for i in range(len(grades)):
        n=grades[i] % 5
        if (5-n<3):
            if((grades[i]+(5-n)>=40)):
              grades[i]=grades[i]+(5-n)
return grades
© www.soinside.com 2019 - 2024. All rights reserved.