Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归算法C#_C#_Algorithm_Binary Tree - Fatal编程技术网

递归算法C#

递归算法C#,c#,algorithm,binary-tree,C#,Algorithm,Binary Tree,我需要一些关于使用C#的算法的帮助。 我有一个对象列表,项目的倍数为4,我应该只返回两个最好的项目。 每个项目都有一个值和一个说明。我还必须对每两个要素进行比较。我想递归调用这个方法,直到我只有2个元素 例如: CardList.Add(new Card("Name A", 150)); CardList.Add(new Card("Name B", 100)); CardList.Add(new Card("Name C", 50)); CardList.Add(new Card("Name

我需要一些关于使用C#的算法的帮助。 我有一个对象列表,项目的倍数为4,我应该只返回两个最好的项目。 每个项目都有一个值和一个说明。我还必须对每两个要素进行比较。我想递归调用这个方法,直到我只有2个元素

例如:

CardList.Add(new Card("Name A", 150));
CardList.Add(new Card("Name B", 100));
CardList.Add(new Card("Name C", 50));
CardList.Add(new Card("Name D", 556));
CardList.Add(new Card("Name E", 170));
CardList.Add(new Card("Name F", 160));
CardList.Add(new Card("Name G", 30));
CardList.Add(new Card("Name H", 650));


public Lis<Card> BestCards(Lis<Card> list){
    List<Card> listResult = new List<Card>(); 
    for(int i=1; i<=list.lenght; i+2)
    {
        if(list[i].value> list[i+1].value)
            listResult.Add(list[i])
        else if (list[i].value< list[i+1].value)
            listResult.Add(list[i+1])
        else if (list[i].value==list[i+1].value)    
        {
            // first element according to alphabetical order of the description
            listResult.Add(???)
        }   
    return listResult;
}
CardList.Add(新卡(“名称A”,150));
卡片列表。添加(新卡片(“名称B”,100));
卡片列表。添加(新卡片(“名称C”,50));
卡片列表。添加(新卡片(“名称D”,556));
卡片列表。添加(新卡片(“名称E”,170));
卡片列表。添加(新卡片(“名称F”,160));
卡片列表。添加(新卡片(“名称G”,30));
卡片列表。添加(新卡片(“名称H”,650));
公共Lis最佳卡片(Lis列表){
List listResult=新列表();
对于(int i=1;i列表[i+1]。值)
listResult.Add(列表[i])
else if(列表[i].value

有什么建议吗?

使用您当前使用的方法,您可能会丢失数据,因为您每次进行比较时都会删除一个项目,而不会检查它是否优于整个列表


我建议对列表进行排序,然后以这种方式选择前两项,或者您可以将一项与其他项进行比较,找到最好的两项。

此解决方案应满足您的要求

第一种方法在剩余卡数超过2张时进行迭代,第二种方法比较这些卡并返回结果列表:

public List<Card> BestCards(List<Card> list){
    List<Card> listResult = list; 

    while (listResult.Count > 2)
        listResult = ReduceList(listResult);

    return listResult;
}


public List<Card> ReduceList(List<Card> list)
{
    var listResult = new List<Card>(); 

    for(int i = 0; i <= list.Count - 1; i+=2)
    {
        if(list[i].value > list[i+1].value)
            listResult.Add(list[i]);
        else if (list[i].value< list[i+1].value)
            listResult.Add(list[i+1]);
        else if (list[i].value==list[i+1].value)
            listResult.Add(list[i].name.CompareTo(list[i+1].name) <= 0 ? list[i] : list[i+1]);
    }

    return listResult;
}
公开列表最佳卡片(列表){
列表结果=列表;
而(listResult.Count>2)
listResult=还原列表(listResult);
返回列表结果;
}
公共列表还原列表(列表)
{
var listResult=新列表();
对于(int i=0;i列表[i+1]。值)
listResult.Add(列表[i]);
else if(列表[i].valuelistResult.Add(list[i].name.CompareTo(list[i+1].name))如果您只想要两个最好的项目,为什么不对列表排序并返回前两个项目呢?您想要的内容有什么不同?不是吗?有更有效的方法来查找前K个元素,但它们更难实现。是吗“我还必须对每两个要素进行比较"意思是你需要比较每一对可能的项目?什么是最好的?你有编译的代码吗,即没有
列表。长度
?这是一个家庭作业问题吗?我想修复这个代码,但如果它是家庭作业,会产生反效果…为什么需要递归?通常你不会在两个级别的比较中使用递归因为只使用两个嵌套的for循环更简单。递归减少了代码行数,并且在需要三个以上的嵌套for循环来解决问题时效率更高。