如何使用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);
}