C# 使用递归函数的数组中的C和整数

C# 使用递归函数的数组中的C和整数,c#,arrays,visual-studio,recursion,C#,Arrays,Visual Studio,Recursion,因此,我目前正在尝试使用递归方法计算数组中所有行李的总和。我相信这很容易,但我似乎无法集中注意力。任何帮助都将不胜感激干杯 class Program { static void Main(string[] args) { List<Bag> bags = new List<Bag>(); bags.Add(new Bag("Blue", 25)); bags.Add(new Bag("Red", 35));

因此,我目前正在尝试使用递归方法计算数组中所有行李的总和。我相信这很容易,但我似乎无法集中注意力。任何帮助都将不胜感激干杯

class Program
{
    static void Main(string[] args)
    {
        List<Bag> bags = new List<Bag>();
        bags.Add(new Bag("Blue", 25));
        bags.Add(new Bag("Red", 35));
        bags.Add(new Bag("White", 30));
        int totalVolume = CalcTotalVolume(bags);
        Console.WriteLine("Total volume of bags: {0}", totalVolume);
    }
    static int CalcTotalVolume(List<Bag> bagList)
    {
        //resursive method
        //1. base case is when the list is empty
        if (bagList.Count == 0)
        {
            return 0;
        }
        else
        {
            List<int> subList = bagList.GetRange(1, bagList.Volume - 1);
            int subTotal = CalcTotalVolume(subList);
            int total = bagList[1] + subTotal;
            return total;
        }
    }

}//end of class Program
class Bag
{

    public string Colour { get; set; }
    public int Volume { get; set; }
    public Bag(string co, int vo)
    {
        Colour = co;
        Volume = vo;
    }
}

显然,循环的效率要高得多,但就kata而言,这有点有趣

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Bag> bags = new List<Bag>();
            bags.Add(new Bag("Blue", 25));
            bags.Add(new Bag("Red", 35));
            bags.Add(new Bag("White", 30));
            int totalVolume = CalcTotalVolume(bags);
            Console.WriteLine("Total volume of bags: {0}", totalVolume);
            Console.ReadKey(true);
        }

        static int CalcTotalVolume(IEnumerable<Bag> bags)
        {
            //resursive method
            //1. base case is when the list is empty
            var bag = bags.FirstOrDefault();
            if (bag == null) return 0;

            var subList = bags.Skip(1);
            return bag.Volume + CalcTotalVolume(subList);
        }
    }

    class Bag
    {

        public string Colour { get; set; }
        public int Volume { get; set; }
        public Bag(string co, int vo)
        {
            Colour = co;
            Volume = vo;
        }
    }

}

了解您想要什么样的递归是很有趣的。例如,以下内容也使用递归方法,但它相当于一个简单的求和循环:

class Bag
{
    public string Colour { get; }
    public int Volume { get; }
    public Bag(string c, int v)
    {
        Colour = c;
        Volume = v;
    }
}

class Program
{
    static int CalcTotalVolumeIdx(List<Bag> bags, int i, int sum)
    {
        return (i >= bags.Count) ? sum :
            CalcTotalVolumeIdx(bags, i + 1, sum + bags[i].Volume);
    }

    static int CalcTotalVolume(List<Bag> bags)
    {
        return CalcTotalVolumeIdx(bags, 0, 0);
    }

    static void Main(string[] args)
    {
        List<Bag> bags = new List<Bag>();
        bags.Add(new Bag("Blue", 25));
        bags.Add(new Bag("Red", 35));
        bags.Add(new Bag("White", 30));
        int totalVolume = CalcTotalVolume(bags);
        Console.WriteLine("Total volume of bags: {0}", totalVolume);
    }
}
作为旁注,F实际上会将函数CalcTotalVolumeIdx编译成while循环,因为这种类型的递归是一种众所周知的模式,可以有效地转换


编辑以反映布赖恩的评论。谢谢大家!

请确保您的代码在发布前已完全编译。在我看来,有3条语句似乎无法编译。@Aominè这是我的问题吗?我正在展示到目前为止我尝试过的3种语句列表基于0,因此bagList[1]将获得列表中的第二个包,而不是第一个包。另外,您正在从bagList.Volume中减去以获得子列表。这真的没有什么意义。bagList是一个列表,因此它没有卷。您真的只需要列表的长度bagList.Count-1。@Brian我这样做了,但是我得到了错误错误错误4无法隐式转换类型-我所做的一切只会给我带来另一个错误。Lol您也在尝试将列表分配给列表,这可能就是您得到类型转换错误的地方。使用var关键字有助于防止这些基本错误,并有助于延长键盘的使用寿命:这正是我想要的结果但这不是通过递归方法实现的为什么你认为它不是递归的?我认为递归意味着函数在循环中调用自己?CalcTotalVolume确实调用自己。查看此行返回包。卷+CalcTotalVolumesPublist;这实际上不会编译,Bag没有到int的隐式转换。您需要执行sum+bags[i].Volume。另外,您可以去掉sum参数,只需执行以下操作:bags[i].Volume+CalcTotalVolumeIdxbags,i+1;修正了音量部分。谢谢你指出!至于另一个建议,是的,你可以这样做,但它不是尾部递归。也许C通常不支持它,但在F中,例如,区别是非常重要的。我几天前刚刚了解了tail recursive。我不认为它是C语言的东西,因为我无法想象任何人用C语言写这样的东西会使用递归方法。我不太熟悉F,但我认为这是该语言的一种常见模式,这就是为什么他们可能会识别它并适当地处理它。