gpt4 book ai didi

c# - 为什么要使用迭代而不是尾递归?

转载 作者:IT王子 更新时间:2023-10-29 04:48:50 26 4
gpt4 key购买 nike

什么是设计味道,递归的糟糕实践?一旦我看到 resharper 建议改进,我就迅速在谷歌上四处寻找。看到许多关于将尾递归重构为迭代的评论,并将其称为设计气味。

public static void DebugOutput2(Exception ex) {
if (ex == null) {
return;
}
Debug.WriteLine(ex.Message);
if (ex.InnerException != null) {
DebugOutput2(ex.InnerException);
}
}

// WAS REFACTORED TO

public static void DebugOutput(Exception ex) {
if (ex == null) {
return;
}
while (true) {
Debug.WriteLine(ex.Message);
if (ex.InnerException != null) {
ex = ex.InnerException;
continue;
}
break;
}
}

编辑:基于 C# 编译器处理注释。现在看起来是递归的
目标.net 4.5。 C# 5.0

尾递归版本的 ILDASM 输出:显示递归调用而不是迭代

.method public hidebysig static void  DebugOutput(class [mscorlib]System.Exception ex) cil managed
{
// Code size 54 (0x36)
.maxstack 2
.locals init ([0] bool CS$4$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldnull
IL_0003: ceq
IL_0005: ldc.i4.0
IL_0006: ceq
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: brtrue.s IL_000e
IL_000c: br.s IL_0035
IL_000e: ldarg.0
IL_000f: callvirt instance string [mscorlib]System.Exception::get_Message()
IL_0014: call void [System]System.Diagnostics.Debug::WriteLine(string)
IL_0019: nop
IL_001a: ldarg.0
IL_001b: callvirt instance class [mscorlib]System.Exception [mscorlib]System.Exception::get_InnerException()
IL_0020: ldnull
IL_0021: ceq
IL_0023: stloc.0
IL_0024: ldloc.0
IL_0025: brtrue.s IL_0035
IL_0027: nop
IL_0028: ldarg.0
IL_0029: callvirt instance class [mscorlib]System.Exception [mscorlib]System.Exception::get_InnerException()
IL_002e: call void ca1.Program::DebugOutput(class [mscorlib]System.Exception)
IL_0033: nop
IL_0034: nop
IL_0035: ret

} // end of method Program::DebugOutput

最佳答案

因为人们错误地更关心微优化而不是清晰易读的代码。

关于c# - 为什么要使用迭代而不是尾递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com