You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现周期及边缘触发返回true的定时器判断函数?

解决方案

根据你的需求,on_interval2需要在周期边界的前一个变化、跨边界变化、后一个变化这三个连续步骤中返回true。以下是符合要求的数学逻辑实现:

const on_interval2 = (period, life, life0) => {
    if (life === life0) return false;
    
    const currFloor = Math.floor(life / period);
    const prevFloor = Math.floor(life0 / period);
    
    // 条件1:当前变化直接跨越周期边界(原on_interval的逻辑)
    const crossEdge = prevFloor !== currFloor;
    // 条件2:旧值是周期整数倍(比如4、8、12...),对应从周期点到下一个值的变化
    const prevIsPeriodEdge = Math.floor((life0 - 1) / period) !== prevFloor;
    // 条件3:新值是周期整数倍的前一个数(比如3、7、11...),对应到周期前一个值的变化
    const currIsPrePeriodEdge = currFloor !== Math.floor((life + 1) / period);
    
    return crossEdge || prevIsPeriodEdge || currIsPrePeriodEdge;
}

逻辑说明

这个函数通过三个条件覆盖你需要的所有场景:

  1. crossEdge:检测当前变化是否直接跨越周期边界(比如3→4、11→12),对应原on_interval返回true的场景。
  2. prevIsPeriodEdge:检测旧值life0是否是周期的整数倍(比如4、8),此时从life0到life的变化是周期点后的第一步(比如4→5、12→13)。
  3. currIsPrePeriodEdge:检测新值life是否是周期整数倍的前一个数(比如3、11),此时从life0到life的变化是周期点前的最后一步(比如2→3、10→11)。

验证测试

用你提供的示例和测试用例验证:

示例场景

on_interval2(4, 10, 9) // false → 10不属于周期前1、周期点、周期后1
on_interval2(4, 11, 10) // true → 11是4*3-1(周期前1)
on_interval2(4, 12, 11) // true → 11→12跨越周期点
on_interval2(4, 13, 12) // true → 12是4*3(周期点)
on_interval2(4, 14, 13) // false →14不属于目标区间

自定义测试用例

console.log(on_interval2(4, 3, 2) === true) // true →3是4*1-1
console.log(on_interval2(4, 4, 3) === true) // true →3→4跨越周期点
console.log(on_interval2(4, 5, 4) === true) // true →4是4*1
console.log(on_interval2(4, 7, 8) === true) // true →8→7跨越周期点8
console.log(on_interval2(4, 8, 7) === true) // true →7→8跨越周期点8
console.log(on_interval2(4, 9, 8) === true) // true →8是4*2
console.log(on_interval2(4, 6, 5) === false) // false →6不属于目标区间
console.log(on_interval2(4, 10, 11) === false) // false →10不属于目标区间

所有测试用例均符合预期。

内容的提问来源于stack exchange,提问作者eguneys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:03:50