這只是為了撓癢癢,甚至可能不是一個值得自己解決的問題。
我想撰寫一個遞回階乘函式以在 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
uj5u.com熱心網友回復:
給函式加一個可選引數,表示是否是內部呼叫,所以簽名就變成了
int Factorial(int number, bool inner=false)
外部呼叫仍然Factorial(5)
正常使用,但內部,改變
number *= Factorial(number - 1);
到
number *= Factorial(number - 1, true);
然后在列印數字時,檢查它是否不是內部的,例如
if (!inner) Console.WriteLine(number);
uj5u.com熱心網友回復:
您可以使用本地函式作為實際的遞回部分,使用外部 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;
}
uj5u.com熱心網友回復:
在遞回函式中執行副作用(如計算階乘)通常是一個糟糕的主意,而您正在嘗試做的是您真正不應該做的事情。
得到答案,然后在呼叫代碼中列印出來。
也就是說,這是實作您所要求的一種可怕的方式。請不要這樣做,我只提供這個答案來表明它是可能的。
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
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/434908.html
上一篇:如何在JavaScript和Django中正確使用Fetch?
下一篇:Python遞回函式搜索二叉樹