【问题标题】:c# solving task using recursionc# 使用递归解决任务
【发布时间】:2016-06-01 06:05:14
【问题描述】:

这是数据(模块代码、主题、您必须参加多少科目才能参加此模块、该模块代码

N01 Math 0
N02 Physics 1 N01
N03 Chemistry 2 N01 N02
N04 Sports 0
N05 Logic 1 N04
N06 Music 1 N05
N07 Theatre 2 N03 N06
N08 Law 1 N03
N09 OS 2 N07 N08

最终结果

N01 Math
N04 Sports
N02 Physics
N03 Chemistry
N08 Law
N05 Logic
N06 Music
N07 Theatre
N09 OS

任务:找到所有满足要求的模块,例如(数学和运动没有任何要求,所以他们是第一和第二,要上物理,你必须要数学,没有任何要求,所以物理是第三,依此类推。)

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

【问题讨论】:

  • 您是否可以为此作业寻求帮助?此外,只需从解析数据开始,并大致了解您所拥有的内容。没有代码行你不应该惊慌!
  • 是的。我将所有数据解析为数组。但我不知道如何使用递归。

标签: c# function recursion


【解决方案1】:

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

你需要一个具有

的数据结构
  • ID (string)
  • 姓名 (string)
  • 依赖关系 (List<string>)

您将数据放入这些列表中。

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

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

如果某事物有多个依赖关系,则需要计算所有结果,然后使用最大值。

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

如果您想优化算法,请在计算后立即将分数附加到结构中,并在递归中使用预先计算的分数(如果有),这样您就不必一遍又一遍地为同一个实例重新计算它.


我上面所说的粗略实现(可能比你现在的课程更高级,你绝对应该用你知道的方式去实现你的解决方案,而不是简单地复制它并转过来中):

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();
        }
    }
}

结果是

数学

运动

物理

逻辑

化学

音乐

剧院

法律

操作系统

逻辑只有需要运动。我不知道为什么您的目标是在 before Logic 中对化学进行排序,因为它依赖于其他两个级别的课程。您可能想问一下您的预期结果是如何产生的。它们不相加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2015-10-25
    • 2012-09-16
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多