refactor(web): restructure Vue3 app layout
This commit is contained in:
119
memora-engine/internal/engine/memory.go
Normal file
119
memora-engine/internal/engine/memory.go
Normal file
@@ -0,0 +1,119 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"math"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 记忆引擎 - 基于艾宾浩斯遗忘曲线
|
||||
type MemoryEngine struct {
|
||||
// 基础间隔(小时)
|
||||
baseInterval float64
|
||||
// 最大间隔(天)
|
||||
maxInterval float64
|
||||
}
|
||||
|
||||
// 记忆级别
|
||||
const (
|
||||
Level0 = iota // 完全忘记
|
||||
Level1
|
||||
Level2
|
||||
Level3
|
||||
Level4
|
||||
Level5 // 永久记住
|
||||
)
|
||||
|
||||
func NewMemoryEngine() *MemoryEngine {
|
||||
return &MemoryEngine{
|
||||
baseInterval: 1, // 1小时
|
||||
maxInterval: 30 * 24, // 30天
|
||||
}
|
||||
}
|
||||
|
||||
// CalculateNextReview 计算下次复习时间
|
||||
// correct: 回答是否正确
|
||||
// currentLevel: 当前掌握程度 0-5
|
||||
func (e *MemoryEngine) CalculateNextReview(correct bool, currentLevel int) time.Duration {
|
||||
var interval float64
|
||||
|
||||
if !correct {
|
||||
// 回答错误,重置到Level1,1小时后复习
|
||||
interval = e.baseInterval
|
||||
} else {
|
||||
// 根据当前级别计算间隔
|
||||
switch currentLevel {
|
||||
case 0:
|
||||
interval = 1 // 1小时后
|
||||
case 1:
|
||||
interval = 12 // 12小时后
|
||||
case 2:
|
||||
interval = 24 // 1天后
|
||||
case 3:
|
||||
interval = 72 // 3天后
|
||||
case 4:
|
||||
interval = 168 // 7天后
|
||||
case 5:
|
||||
interval = 360 // 15天后
|
||||
default:
|
||||
interval = e.baseInterval
|
||||
}
|
||||
|
||||
// 增加难度系数
|
||||
interval = interval * 1.2
|
||||
}
|
||||
|
||||
// 限制最大间隔
|
||||
interval = math.Min(interval, e.maxInterval)
|
||||
|
||||
return time.Duration(interval) * time.Hour
|
||||
}
|
||||
|
||||
// GetMasteryLevel 计算掌握程度
|
||||
// correctCount: 正确次数
|
||||
// totalCount: 总次数
|
||||
func (e *MemoryEngine) GetMasteryLevel(correctCount, totalCount int) int {
|
||||
if totalCount == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
// 正确率
|
||||
rate := float64(correctCount) / float64(totalCount)
|
||||
|
||||
// 根据正确率和次数计算级别
|
||||
if totalCount < 3 {
|
||||
if rate >= 0.8 {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
if rate >= 0.9 {
|
||||
return 5
|
||||
} else if rate >= 0.8 {
|
||||
return 4
|
||||
} else if rate >= 0.7 {
|
||||
return 3
|
||||
} else if rate >= 0.5 {
|
||||
return 2
|
||||
} else {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
// IsDueForReview 是否应该复习
|
||||
func (e *MemoryEngine) IsDueForReview(lastReview *time.Time, nextReview *time.Time) bool {
|
||||
now := time.Now()
|
||||
|
||||
// 没有复习记录,需要复习
|
||||
if lastReview == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
// 有计划复习时间
|
||||
if nextReview != nil {
|
||||
return now.After(*nextReview)
|
||||
}
|
||||
|
||||
// 默认:超过1天没复习需要复习
|
||||
return now.Sub(*lastReview) > 24*time.Hour
|
||||
}
|
||||
Reference in New Issue
Block a user