为了在Android中创建词汇练习应用程序,我想在Java中实现SuperMemo(SM-2)算法.这是间隔重复软件的流行选择,Anki甚至按照我的理解采用它.这里给出的源代码示例很难(对我来说)因为缺少代码格式化而且因为它是用Delphi编写的.
SuperMemo的作者指出:
- 将知识分成尽可能小的项目.
- 所有项目关联的E因子等于2.5.
- 使用以下间隔重复项目:I(1):= 1
I(2):= 6
,n> 2:I(n):= I(n-1)*EF
其中:
I(n) - 重复间隔第n次重复后的间隔(以天为单位),
给定项目的EF - E因子
如果interval是分数,则将其四舍五入到最接近的整数.- 每次重复后,评估重复反应的质量为0-5级:5 - 完美反应
4 - 犹豫后的
正确反应3 - 正确的反应回忆严重困难
2 - 不正确的反应; 正确的一个似乎很容易回忆
1 - 不正确的反应; 正确的人记得
0 - 完全停电.- 每次重复后,根据公式修改最近重复项目的E因子:
EF':= EF +(0.1-(5-q)*(0.08+(5-q)*0.02))
其中:
EF' - 新E因子的
值,EF- E因子的旧值,
q- 0-5等级的响应质量.
如果EF小于1.3,那么让EF为1.3.- 如果质量响应低于3,则从头开始重复项目而不改变E因子(即使用间隔I(1),I(2)等,就好像项目被重新记忆一样).
- 在给定日期的每次重复会话之后,再次重复质量评估中得分低于4的所有项目.继续重复,直到所有这些项目得分至少为4.
以下是Stack Overflow的一些相关(但不同)的问题:
你是如何用Java实现的?
(我最近一直在研究这个问题,我想我有一个答案,所以我提交这个作为Q&A对来帮助其他人做同样的事情.)