# 複習算法簡化說明 ## 🎯 **核心問題** 當前的 `下次複習時間 = 2^成功複習次數` 增長太快,只需9次就達到365天。 ## 📐 **新算法設計(簡化版)** ### **基本公式** ``` 新間隔 = 舊間隔 × 增長係數 × 表現係數 ``` ### **1. 增長係數表** 根據當前間隔決定增長速度: | 當前間隔範圍 | 增長係數 | 說明 | |-------------|---------|------| | 1-7天 | 1.8 | 初期較快增長 | | 8-30天 | 1.4 | 中期穩定增長 | | 31-90天 | 1.2 | 後期緩慢增長 | | 91天以上 | 1.1 | 維持長期記憶 | ### **2. 表現係數表** #### **翻卡題(用戶自評)** | 用戶選擇 | 係數 | 說明 | |---------|------|------| | 完全不記得 | 0.5 | 大幅縮短間隔 | | 有印象但不確定 | 0.7 | 稍微縮短 | | 記得但需思考 | 1.0 | 維持原間隔 | | 清楚記得 | 1.2 | 稍微延長 | | 非常熟悉 | 1.4 | 明顯延長 | #### **客觀題(對錯判斷)** | 結果 | 反應時間 | 係數 | 說明 | |------|---------|------|------| | 答對 | < 3秒 | 1.2 | 很熟悉 | | 答對 | 3-8秒 | 1.1 | 正常 | | 答對 | > 8秒 | 1.0 | 緩慢 | | 答錯 | 任何 | 0.6 | 需練習 | ## 🆕 **初始間隔設計** ### **新增詞卡的預設值** 當用戶新增詞卡時,系統自動設定: - **IntervalDays**: 1天(資料庫預設值) - **NextReviewDate**: 今天(立即可復習) - **Repetitions**: 0(尚未復習) ### **第一次復習的間隔計算** 當用戶第一次復習新詞卡時,使用相同的公式: | 表現 | 計算過程 | 結果 | |------|----------|------| | 答對 | 1天 × 1.8 × 1.1 = 1.98天 | **2天後復習** | | 答錯 | 1天 × 1.8 × 0.6 = 1.08天 | **1天後復習** | ### **為什麼初始間隔是1天?** 1. **符合直覺**: 新學的詞彙需要快速復習 2. **避免遺忘**: 短間隔確保新記憶得到鞏固 3. **資料庫一致**: 與現有的 `IntervalDays = 1` 預設值保持一致 ## 🔢 **實際計算範例** ### **範例:詞彙 "sophisticated" 的完整學習歷程** | 階段 | 當前間隔 | 表現 | 增長係數 | 表現係數 | 計算過程 | 新間隔 | 說明 | |------|---------|------|---------|---------|---------|--------|------| | 新增 | - | - | - | - | - | **1天** | 系統預設初始間隔 | | 第1次 | 1天 | 答對(正常) | 1.8 | 1.1 | 1×1.8×1.1 | **2天** | 第一次復習成功 | | 第2次 | 2天 | 答對(快速) | 1.8 | 1.2 | 2×1.8×1.2 | **4天** | 反應快速,獎勵 | | 第3次 | 4天 | 答錯 | 1.8 | 0.6 | 4×1.8×0.6 | **4天** | 答錯,間隔未增加 | | 第4次 | 4天 | 答對(正常) | 1.8 | 1.1 | 4×1.8×1.1 | **8天** | 重新開始增長 | | 第5次 | 8天 | 答對(正常) | 1.4 | 1.1 | 8×1.4×1.1 | **12天** | 進入中期階段 | | 第6次 | 12天 | 答對(快速) | 1.4 | 1.2 | 12×1.4×1.2 | **20天** | 反應快速,獎勵 | | 第7次 | 20天 | 答對(正常) | 1.4 | 1.1 | 20×1.4×1.1 | **31天** | 穩定增長 | | 第8次 | 31天 | 答對(正常) | 1.2 | 1.1 | 31×1.2×1.1 | **41天** | 進入後期階段 | | 第9次 | 41天 | 答對(正常) | 1.2 | 1.1 | 41×1.2×1.1 | **54天** | 緩慢增長 | | 第10次 | 54天 | 答對(正常) | 1.2 | 1.1 | 54×1.2×1.1 | **71天** | 長期記憶階段 | ## 📊 **算法對比圖表** ### **時間增長對比** ``` 天數 400 | | ●─── 現有算法 (2^n) 300 | ╱ | ╱ 200 |╱ | 100 | ╭──●──●──●─── 新算法 (漸進式) | ╱ 50 |╱ | 0 +────────────────────→ 1 3 5 7 9 復習次數 現有算法: 1→2→4→8→16→32→64→128→256天 新算法: 1→2→4→8→12→20→31→41→54天 ``` ## 🎯 **關鍵優勢** ### **1. 更合理的學習曲線** - **現有**: 9次復習就達到256天 - **新版**: 10次復習才71天,需要更多次數達到長間隔 ### **2. 錯誤恢復機制** - **現有**: 錯誤後直接 ×0.6,可能重置太多進度 - **新版**: 錯誤後根據當前階段調整,避免過度懲罰 ### **3. 階段性增長** - **初期**: 快速建立基礎記憶 - **中期**: 穩定鞏固 - **後期**: 維持長期記憶 ## 🛠️ **實作的 C# 代碼** ```csharp public class SpacedRepetitionService { /// /// 計算下次復習間隔 /// /// 詞卡實體(包含 IntervalDays 等欄位) /// 是否答對 /// 信心程度(1-5,僅翻卡題使用) /// 新的間隔天數 public int CalculateNextInterval(Flashcard flashcard, bool isCorrect, double? confidenceLevel = null) { // 1. 取得當前間隔(新詞卡預設為1天) int currentInterval = flashcard.IntervalDays; // 資料庫欄位,預設值 = 1 // 2. 決定增長係數(根據當前間隔階段) double growthFactor = currentInterval switch { <= 7 => 1.8, // 初期階段(包含第一次復習) <= 30 => 1.4, // 中期階段 <= 90 => 1.2, // 後期階段 _ => 1.1 // 維持期 }; // 3. 決定表現係數 double performanceFactor; if (confidenceLevel.HasValue) // 翻卡題(主觀評估) { performanceFactor = confidenceLevel.Value switch { 1 => 0.5, // 完全不記得 2 => 0.7, // 有印象但不確定 3 => 1.0, // 記得但需思考 4 => 1.2, // 清楚記得 5 => 1.4, // 非常熟悉 _ => 1.0 }; } else // 客觀題(對錯判斷) { performanceFactor = isCorrect ? 1.1 : 0.6; } // 4. 計算新間隔 double newInterval = currentInterval * growthFactor * performanceFactor; // 5. 限制範圍並四捨五入 int result = Math.Max(1, Math.Min(365, (int)Math.Round(newInterval))); return result; } /// /// 更新詞卡的復習資訊 /// public void UpdateFlashcardAfterReview(Flashcard flashcard, int newInterval, bool isCorrect) { // 更新間隔天數 flashcard.IntervalDays = newInterval; // 更新下次復習日期 flashcard.NextReviewDate = DateTime.Today.AddDays(newInterval); // 更新統計資料 flashcard.TimesReviewed++; if (isCorrect) { flashcard.TimesCorrect++; } // 更新熟悉程度(簡化版) flashcard.MasteryLevel = Math.Min(100, (flashcard.TimesCorrect * 10) + (newInterval * 365 / 100)); } } ``` ### **與現有資料庫的整合** ```csharp // 在 FlashcardsController 中的使用範例 [HttpPost("{id}/review")] public async Task ReviewFlashcard(Guid id, ReviewRequest request) { var flashcard = await _context.Flashcards.FindAsync(id); if (flashcard == null) return NotFound(); // 使用新算法計算間隔 var spacedRepetition = new SpacedRepetitionService(); int newInterval = spacedRepetition.CalculateNextInterval( flashcard, request.IsCorrect, request.ConfidenceLevel ); // 更新詞卡資訊 spacedRepetition.UpdateFlashcardAfterReview(flashcard, newInterval, request.IsCorrect); await _context.SaveChangesAsync(); return Ok(new { newInterval, nextReviewDate = flashcard.NextReviewDate, masteryLevel = flashcard.MasteryLevel }); } ``` ## 🤔 **為什麼這樣設計?** ### **階段性增長的科學依據** 1. **初期 (1.8倍)**: 新記憶需要頻繁鞏固 2. **中期 (1.4倍)**: 記憶開始穩定,可適度延長 3. **後期 (1.2倍)**: 長期記憶,緩慢增長避免遺忘 4. **維持期 (1.1倍)**: 微調保持長期記憶 ### **表現係數的心理學依據** - **主觀評估**: 反映學習者真實感受,5個等級提供細緻調整 - **客觀測試**: 簡單的對錯判斷,避免過度複雜化 - **快速獎勵**: 快速正確答題獲得額外係數獎勵 這個算法的**核心思想**:根據當前學習階段和表現,智能調整復習頻率,既避免遺忘,也不浪費時間。