c#使用递归解决任务

c#使用递归解决任务,c#,function,recursion,C#,Function,Recursion,这是数据(模块代码、科目、参加本模块所需的科目数、模块代码) 最终结果 N01 Math N04 Sports N02 Physics N03 Chemistry N08 Law N05 Logic N06 Music N07 Theatre N09 OS 任务:找到所有符合要求的模块,例如(数学和体育没有任何要求,所以它们是第一和第二,为了学习物理,你必须学习数学,数学没有任何要求,所以物理是第三,以此类推。) 我必须使用递归来解决这个问题,但我不知道从哪里开始,堆栈是什么,我只知道如何使用

这是数据(模块代码、科目、参加本模块所需的科目数、模块代码)

最终结果

N01 Math
N04 Sports
N02 Physics
N03 Chemistry
N08 Law
N05 Logic
N06 Music
N07 Theatre
N09 OS
任务:找到所有符合要求的模块,例如(数学和体育没有任何要求,所以它们是第一和第二,为了学习物理,你必须学习数学,数学没有任何要求,所以物理是第三,以此类推。)


我必须使用递归来解决这个问题,但我不知道从哪里开始,堆栈是什么,我只知道如何使用递归来解决简单的问题,比如寻找阶乘。有没有解决这个问题的提示或指南?

我不会给你任何代码,因为这是你的工作。但让你知道怎么做:

您需要一个具有

  • ID(
    字符串
  • 名称(
    字符串
  • 依赖项(
    列表
你把你的数据放进一个列表中

然后,您可以编写一个函数,我们称之为
CalcDependencyLevel
,它计算每个数据结构相对于结构列表的依赖级别:

此方法检查依赖项。如果没有依赖项,则为0。如果有一个依赖项,则为1+该依赖项的
CalcDependencyLevel
结果(这是递归)

如果某个对象具有多个依赖项,则需要计算所有结果,然后使用最大值

将此分数附加到每个数据结构,然后按该分数排序

如果要优化算法,请在计算分数后立即将分数附加到结构,并在递归中使用预先计算的分数(如果可用),这样就不必反复为同一实例重新计算分数


大致实现了我上面所说的内容(可能比你现在的课程更高级,你一定要用你知道的方法来实现你的解决方案,而不仅仅是复制并提交):

使用系统;
名称空间控制台App14
{
使用System.Collections.Generic;
使用System.Linq;
内部课程
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共列表依赖项{get;set;}
公共int?DependencyDepth{get;set;}
公共重写字符串ToString()
{
返回名称;
}
}
内部课程计划
{
私有静态字符串数据=“N01数学0\n”
+“N02物理1 N01\n”
+“N03化学2 N01 N02\n”
+“N04运动版0\n”
+“N05逻辑1 N04\n”
+“N06音乐1 N05\n”
+“N07剧院2 N03 N06\n”
+“N08法律1 N03\n”
+“N09操作系统2 N07 N08\n”;
私有静态int DependencyDepth(课程、列表课程)
{
if(!course.DependencyDepth.HasValue)
{
如果(!course.Dependencies.Any())
{
course.DependencyDepth=0;
}
其他的
{
course.DependencyDepth=1+course.DependencyDepth.Max(dep=>DependencyDepth(courses.First(c=>c.Id==dep),courses));
}
}
返回course.dependency.depth.Value;
}
静态void Main()
{
var courses=data.Split(“\n”,StringSplitOptions.RemoveEmptyEntries)
.Select(line=>line.Split(“”)
.Select(parts=>newcourse{Id=parts[0],Name=parts[1],Dependencies=parts.Skip(3).ToList()})
.ToList();
courses.ForEach(course=>DependencyDepth(course,courses));
courses.OrderBy(course=>course.DependencyDepth.ToList().ForEach(Console.WriteLine);
Console.ReadLine();
}
}
}

结果是

数学

运动

物理学

逻辑

化学

音乐

剧院

法律

操作系统


逻辑只需要运动。我不知道为什么你的目标是在逻辑之前把化学排序,因为它依赖于其他两个级别的课程。你可能想问你的预期结果是如何产生的。它们不符合要求。

你可以为这项作业寻求帮助吗?另外,从分析数据开始,并对你的内容进行概述是的。你不应该因为没有代码行而惊慌失措!是的。我将所有数据解析到数组中。但我不知道如何使用递归。
N01 Math
N04 Sports
N02 Physics
N03 Chemistry
N08 Law
N05 Logic
N06 Music
N07 Theatre
N09 OS
using System;

namespace ConsoleApp14
{
    using System.Collections.Generic;
    using System.Linq;

    internal class Course
    {
        public string Id { get; set; }

        public string Name { get; set; }

        public List<string> Dependencies { get; set; }

        public int? DependencyDepth { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }

    internal class Program
    {
        private static string data = "N01 Math 0\n" 
                                   + "N02 Physics 1 N01\n"
                                   + "N03 Chemistry 2 N01 N02\n"
                                   + "N04 Sports 0\n"
                                   + "N05 Logic 1 N04\n"
                                   + "N06 Music 1 N05\n"
                                   + "N07 Theatre 2 N03 N06\n"
                                   + "N08 Law 1 N03\n"
                                   + "N09 OS 2 N07 N08\n";

        private static int DependencyDepth(Course course, List<Course> courses)
        {
            if (!course.DependencyDepth.HasValue)
            {
                if (!course.Dependencies.Any())
                {
                    course.DependencyDepth = 0;
                }
                else
                {
                    course.DependencyDepth = 1 + course.Dependencies.Max(dep => DependencyDepth(courses.First(c => c.Id == dep), courses));
                }
            }

            return course.DependencyDepth.Value;
        }

        static void Main()
        {
            var courses = data.Split("\n", StringSplitOptions.RemoveEmptyEntries)
                              .Select(line => line.Split(" "))
                              .Select(parts => new Course { Id = parts[0], Name = parts[1], Dependencies = parts.Skip(3).ToList() })
                              .ToList();

            courses.ForEach(course => DependencyDepth(course, courses));

            courses.OrderBy(course => course.DependencyDepth).ToList().ForEach(Console.WriteLine);
            
            Console.ReadLine();
        }
    }
}