使用oops概念打印从1到1000的数字



如何使用oop概念(即不使用循环,数组和递归)打印从1到1000的数字

既然您提到了OOP概念,其中之一就是封装。当方法完成工作时,你不关心实现细节。

几乎所有的linq扩展方法在实现中都使用了循环(实际上不同于迭代器),很容易没有意识到这一点,因为它是封装在实现中的细节。

要回答你的问题,不使用循环的唯一方法是编写WriteLine调用1000次。

在OOP中,您创建一个类来封装逻辑,然后使用它:

class Program
{
    static void Main(string[] args)
    {
        (new RangePrinter).PrintRange(1, 1001);
    }
}

没有循环,对吗?实际上,循环被封装在实现中。

class RangePrinter
{
   /* Injecting the Write target is skipped for simplicity */
   public void PrintRange(int lowerBound, int upperBound)
   {
      for(int i = lowerBound; i < upperBound; i++)
      {
         Console.WriteLine(i);
      }
   }
}

同样适用于使用Enumerable(又名Linq扩展方法):

Enumerable.Range(1, 1000).ToList().ForEach(x=> { Console.WriteLine(x); });
下面是。net框架团队如何实现Range Internal方法的:
static IEnumerable<int> RangeIterator(int start, int count) {
            for (int i = 0; i < count; i++) yield return start + i;
        }

结论,当你需要做重复的工作时,你需要一个循环。任何在集合上迭代的c# API (Linq的Where, Select等)都使用循环。循环并不坏,除非不需要它们,或者当有其他方法时它们被嵌套。


只是为了好玩,如果这是一个谜题(忘记OOP需求部分),那么您可以这样做:

string oneToThousand = @"1rn2rn3rn4rn5rn6rn7rn8rn9rn10rn11rn12rn13rn14rn15rn16rn17rn18rn19rn20rn" +
                        "21rn22rn23rn24rn25rn26rn27rn28rn29rn30rn31rn32rn33rn34rn35rn36rn37rn38rn39rn40rn" +
                        "41rn42rn43rn44rn45rn46rn47rn48rn49rn50rn51rn52rn53rn54rn55rn56rn57rn58rn59rn60rn" +
                        "61rn62rn63rn64rn65rn66rn67rn68rn69rn70rn71rn72rn73rn74rn75rn76rn77rn78rn79rn80rn" +
                        "81rn82rn83rn84rn85rn86rn87rn88rn89rn90rn91rn92rn93rn94rn95rn96rn97rn98rn99rn100rn";
                        /* Continue to 1000 */
Console.WriteLine(oneToThousand);

递归函数(DEF)是一种函数,它要么调用自己,要么处于函数调用的潜在循环中。正如定义所指定的,有两种类型的递归函数。考虑一个调用自身的函数:我们称这种类型的递归为直接递归。

例子:

public static void PrintTo(int number)
{
    if (number == 0)
        return;
    Console.WriteLine(number);
    PrintTo(number - 1);
}
static void Main(string[] args)
{
    PrintTo(1000);
}

最新更新