自行打印到控制台的递归阶乘函数 (C#)



这只是一个权宜之计,甚至可能不是一个值得单独解决的问题。

我想写一个递归阶乘函数,用C#打印到控制台。问题是,出于好奇,我试图通过传递函数和参数来实现这一点。和中一样,我想避免键入Console.WriteLine(Factorial(5));

我想输入这个并得到一个结果是很难的:

> Factorial(5);

这是我一直在玩的功能:

int Factorial(int number)
{
Console.Write(number != 1 ? $"{number} x " : $"{number} = n");
if (number <= 1) return 1; // end of the line
number *= Factorial(number - 1); // recursive function
Console.WriteLine(number);
return number; // this could have been combined with line above, but more clear this way
}

结果是这样的,而不是看到2、6和24。我只想看看120:

5 x 4 x 3 x 2 x 1 =
2
6
24
120

向函数添加一个可选参数,指示它是否是内部调用,因此签名将变为

int Factorial(int number, bool inner=false)

外部呼叫仍正常使用Factorial(5),但内部更改

number *= Factorial(number - 1);

number *= Factorial(number - 1, true);

然后在打印数字时,检查它是否不在内部,例如

if (!inner) Console.WriteLine(number);

您可以使用本地函数作为实际的递归部分,使用外部Factorial函数作为只调用它的包装器!

int Factorial(int number)
{
static int DoFactorial(int number) => number <= 1
? 1
: number *= DoFactorial(number - 1);

var answer = DoFactorial(number);
Console.WriteLine(answer);

return answer;
}

在递归函数中执行副作用(如计算阶乘(通常是一个糟糕的想法,而你真正不应该做的事情。

获取答案,然后将其打印在调用代码中。

也就是说,这是一个可怕的方式来实现你的要求。请不要这样做,我提供这个答案只是为了表明这是可能的。

using System;
using System.Diagnostics;
namespace Test
{
public static class Program
{
static void Main(string[] args)
{
var stackTrace = new StackTrace();
var frames = stackTrace.GetFrames();
Factorial(5, frames.Length);
}
static int Factorial(int number, int frameCount)
{
Console.Write(number != 1 ? $"{number} x " : $"{number} = n");
if (number <= 1)
{
return 1; // end of the line
}
number *= Factorial(number - 1, frameCount); // recursive function
var stackTrace = new StackTrace();
var frames = stackTrace.GetFrames();
if (frames.Length == frameCount + 1)
{
Console.WriteLine(number);
}
return number; // this could have been combined with line above, but more clear this way
}
}
}

最新更新