遗忘时间点=ft,期望记忆时长=kt
当前系统时间=ct
ckt=当前和遗忘时间点的距离=abs(ft-ct)
r=距离遗忘的比例=ckt/kt
r越小说明越接近遗忘时间点
每一个单词都会根据系统记录中的数据和当前系统时间计算出一个r.
除了顺序方法,还有什么方法能找出一个最小的r?
(如果我的意思说清楚了,可以不用看)下面是顺序的实现:
代码: 全选
bool recognize_review(void)
{
const time_t current_time=time(NULL);//当前系统时间
double current_abs=0;//当前abs函数的返回值
//遗忘和记忆比例,越小说明越接近遗忘临界点
//遗忘最佳比例
double forget_best_ratio=0.;
//被遗忘的最适合复习的单词位置
unsigned forget_best_word_site=current_word_array_start;//(如果没有更比例(更接近临界点)的单词,则推荐数组中第一个单词)
//记忆最佳比例
double memory_best_ratio=0.;
//没被遗忘的最适合复习的单词位置
unsigned memory_best_word_site=current_word_array_start;//(如果没有更比例(更接近临界点)的单词,则推荐数组中第一个单词)
//当前单词比例
double current_ratio=0.;
//最适合复习的单词(如果没有更比例(更接近临界点)的单词,则推荐数组中第一个单词)
unsigned best_word_site=current_word_array_start;
bool be_forget=false;//是否存在被遗忘的单词,如果为false表示没有单词是被遗忘的
if(!file_head.word_total)
{
fputs("主数据文件中没有任何单词\n",stderr);
return false;
}
//如果第一次碰到被遗忘的单词,则直接设置其为最佳遗忘单词
//该变量用来判断是否是第一次碰到被遗忘的单词.
bool first_forget=true;
//如果第一次碰到被记住的单词,则直接设置其为最佳记忆单词
//该变量用来判断是否是第一次碰到被记住的单词.
bool first_memory=true;
//i是元素下标计数器
for(unsigned i=current_word_array_start; i<file_head.word_total; i++)
{
//如果期望记忆时长是0,则不再继续查找,立即复习该单词
if(word_array[i].M_X_EXPECT_MEMORY_DURATION==0)
{
//发现被遗忘的单词,无论如何都会推荐一个被遗忘的单词给用户复习.
//因为期望记忆时长为0,所以认为它是被忘记的单词,把它当作被遗忘的单词处理.
be_forget=true;
//当前单词需要立即复习,设置为最佳单词
forget_best_word_site=i;
break;
}
//获取当前单词的绝对值
current_abs=fabs((double)(word_array[i].M_X_EXPECT_FORGET_TIME-current_time));
//如果单词被忘记
if(current_time>=word_array[i].M_X_EXPECT_FORGET_TIME)
{
//发现被遗忘的单词,无论如何都会推荐一个被遗忘的单词给用户复习.
be_forget=true;
//如果第一次碰到被遗忘的单词
if(first_forget)
{
//将first_forget置为false,表示已经遇到第一个被遗忘单词.
first_forget=false;
//将当前单词设置为最佳被遗忘单词.
forget_best_word_site=i;
//将遗忘最佳单词比例设置为当前单词的临界点比例
forget_best_ratio=current_abs/(double)(word_array[i].M_X_EXPECT_MEMORY_DURATION);
}
//否则,即非第一次碰到被遗忘的单词
else
{
//获取当前单词的临界点比例
current_ratio=current_abs/(double)(word_array[i].M_X_EXPECT_MEMORY_DURATION);
//如果当前单词的临界点比例更小则设置相应最佳单词和最佳比例
if(current_ratio<forget_best_ratio)
{
//设置最佳单词临界点比例
forget_best_ratio=current_ratio;
//设置最佳被遗忘单词
forget_best_word_site=i;
}
}
}
//否则单词没有被忘记(即单词被记住)
else
{
//如果第一次碰到被记住的单词
if(first_memory)
{
//将first_memory置为false,表示已经遇到第一个被记住单词
first_memory=false;
//将当前单词设置为最佳单词
memory_best_word_site=i;
//将记忆最佳比例设置为当前单词的临界点比例
memory_best_ratio=current_abs/(double)(word_array[i].M_X_EXPECT_MEMORY_DURATION);
}
//否则,即非第一次碰到被记住的单词
else
{
//获取当前单词的临界点比例
current_ratio=current_abs/(double)(word_array[i].M_X_EXPECT_MEMORY_DURATION);
//如果当前单词的临界点比例更小则设置相应最佳单词和最佳比例
if(current_ratio<memory_best_ratio)
{
//设置最佳单词临界点比例
memory_best_ratio=current_ratio;
//设置最佳被遗忘单词
memory_best_word_site=i;
}
}
}
}
//如果发现被遗忘的单词则优先复习分数(比例)上最接近遗忘临界点的被遗忘单词
if(be_forget)
{
best_word_site=forget_best_word_site;
}
//否则,即全部单词都被记住,优先复习分数(比例)上最接近遗忘临界点的被记住单词
else
{
best_word_site=memory_best_word_site;
}
while(M_GIVE_USER_X_REVIEW(best_word_site));
return true;
}