我可以使用什么条件来终止递归?

时间:2017-12-22 21:45:26

标签: c# recursion

我的程序中有一个递归问题。

我想在一个单词列表中随机找到一个单词,但如果难度级别为“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();

    }

2 个答案:

答案 0 :(得分:0)

你最好将简单的单词与简单单词分开。不是保留单个maList,而是根据其长度填充两个单独的facileListdifficileList。现在,您可以在一些随机级别限制递归调用的数量,例如,在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 @建议的其他改进也适用于此。