我一直在做這項任務,無法思考如何將我的 for 回圈轉換為遞回回圈并找到我的樹的深度。甚至可以在沒有 for 回圈的情況下覆寫所有樹的葉子嗎?因為一棵樹可以有很多分支,我不確定如何在沒有回圈的情況下測量深度。
static int RecursiveMethodMeasureDepth(Branch branch)
{
int value = 1;
int highestValue = 1;
for (int i = 0; i < branch.Count(); i )
{
value = RecursiveMethodMeasureDepth(branch.GetBranch(i)) 1;
highestValue = value > highestValue ? value : highestValue;
}
return highestValue;
}
如果有人想知道 Branch 類,那就是:
public class Branch
{
private List<Branch> branches;
public Branch()
{
branches = new List<Branch>();
}
public void AddBranch(Branch branch)
{
branches.Add(branch);
}
public Branch GetBranch(int index)
{
return branches[index];
}
public int Count()
{
return branches.Count;
}
}
我在下面添加了一張樹的圖片和一個創建相同資料結構樹的方法:
static Branch initializeTree()
{
Branch root = new Branch();
Branch branch2 = new Branch();
Branch branch3 = new Branch();
root.AddBranch(branch2);
root.AddBranch(branch3);
Branch branch4 = new Branch();
branch2.AddBranch(branch4);
Branch branch5 = new Branch();
Branch branch6 = new Branch();
Branch branch7 = new Branch();
branch3.AddBranch(branch5);
branch3.AddBranch(branch6);
branch3.AddBranch(branch7);
Branch branch8 = new Branch();
branch5.AddBranch(branch8);
Branch branch9 = new Branch();
Branch branch10 = new Branch();
branch6.AddBranch(branch9);
branch6.AddBranch(branch10);
Branch branch11 = new Branch();
branch9.AddBranch(branch11);
return root;
}
[樹示例][1] [1]:https://i.stack.imgur.com/BqYU2.png
uj5u.com熱心網友回復:
如果你想避免那里有 for 回圈但保持遞回呼叫,你可以使用 LINQ Aggregate:
static int RecursiveMethodMeasureDepth(Branch branch)
{
return branch
.branches
.Aggregate(1, (depth, b) =>
{
var currentDepth = RecursiveMethodMeasureDepth(b) 1;
return depth < currentDepth ? currentDepth : depth;
});
}
參考 https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.aggregate?view=net-6.0
uj5u.com熱心網友回復:
此建議不使用更多遞回,但它允許您通過利用.Max()System.Linq 命名空間并將當前深度作為引數發送到遞回方法來計算深度而無需使用占位符。
//using System.Linq;
static int RecursiveMethodMeasureDepth(Branch branch, int currentDepth = 1)
{
if (branch.Count() == 0)
{
return currentDepth;
}
return Enumerable.Range(0, branch.Count())
.Max(i => RecursiveMethodMeasureDepth(branch.GetBranch(i), currentDepth 1));
}
用法:
Branch tree;
//initialize tree
int depth = RecursiveMethodMeasureDepth(tree);
正如dr.null在對此答案的評論中所建議的那樣,這種特定于類的方法可以/應該作為Branch類中的方法來實作。
這樣的實作可能如下所示:
//using System.Linq;
public class Branch
{
//Other properties and methods
public int Depth => GetDepth();
private int GetDepth(int currentDepth = 1)
{
if (!branches.Any())
{
return currentDepth;
}
return branches.Max(branch => branch.GetDepth(currentDepth 1));
}
}
并被如下呼叫:
Branch tree;
//initialize tree
int depth = tree.Depth;
示例小提琴在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462011.html
