Guy*_*der 3 f# tail-recursion tail-call-optimization
问题Stack尽管尾部调用位置溢出但仅在64位导致发现F#编译器中的错误.
在阅读答案后,我很好奇导致找到错误的原因,因为我希望更好地提高我解决问题和理解TCO的技能.
我的理由是这样的:
在查看计算表达式时谈论"尾调用"可能会产生误导 - 一般情况下确实没有这样的事情(例如,参见一个相关讨论的其他答案,尽管与序列表达式无关).
所以调用gauss本身不会溢出堆栈,只有迭代它的代码才能使它溢出.但是,一旦我看到调用代码就是这样Seq.nth,那意味着几乎肯定会有编译器错误,因为yield!序列表达式中的" tailing" 模式应该被优化(不确定这是否是规范,但我认为它是众所周知的).那么这只是看到初始复制品的哪些部分是必要的.
用非递归定义替换原始代码中的循环使得repro stop失败,删除模式匹配也是如此.我没有看到IL有用(编译器生成的机器涉及序列表达式的编译),我只是尝试在源级别最小化repro并根据经验测试行为.