我的程序中有一个递归问题。
我想在一个单词列表中随机找到一个单词,但如果难度级别为“easy”,我希望单词少于六个字母;对于“hard”级别,我希望单词少于六个。
我知道我应该有一个断点,但由于我不知道在用户找到一个好词之前它可能循环多少次,我不知道该怎么做。
如何终止递归?
private void trouverMot()
{
var random = new Random();
int index = random.Next(0,maList.Count);
mot = (maList[index].Trim());
if(niveau == "Facile")
{
if(mot.Length > 6 || lstUse.Contains(mot))
{
trouverMot();
}
}else
{
if(mot.Length < 6 || lstUse.Contains(mot))
{
trouverMot();
}
}
lstUse.Add(mot);
affichage();
}
答案 0 :(得分:0)
你最好将简单的单词与简单单词分开。不是保留单个maList
,而是根据其长度填充两个单独的facileList
和difficileList
。现在,您可以在一些随机级别限制递归调用的数量,例如,在10次重试之后。然后,您可以按如下方式重写您的方法:
private static Random random = new Random();
private void trouverMot(int retry) {
var list = niveau == "Facile" ? facileList : difficileList;
int index = random.Next(0, list.Count);
mot = (list[index].Trim());
if(!lstUse.Contains(mot) || retry == 0) {
lstUse.Add(mot);
affichage();
return;
}
trouverMot(retry-1);
}
答案 1 :(得分:0)
如果您的教师没有义务为此使用递归,那么这是一个有效的非递归版本的代码:
private static Random random = new Random();
private void trouverMot()
{
while (true)
{
int index = random.Next(0,maList.Count);
mot = (maList[index].Trim());
if (niveau == "Facile")
{
if (mot.Length > 6 || lstUse.Contains(mot))
{
continue;
}
}
else
{
if (mot.Length < 6 || lstUse.Contains(mot))
{
continue;
}
}
}
lstUse.Add(mot);
affichage();
}
使用递归来“重启”函数不是一个常见的习惯用法,虽然似乎更简单,但它可能会导致问题(例如StackOverflowException)。
注意:我只更改了递归(并移出了Random
- 请参阅this answer) - dasblinkenlight @建议的其他改进也适用于此。