exercism / exercism/elixir-analyzer

`dna-encoding` doesn't detect tail-recursion within a `case` expression

未关闭
#410 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Elixir
星标
33
派生
33
PR 合并指标
30 天内没有已合并 PR

描述

Based on my understanding, it seems that using a `case` expression for pattern matching, rather than a function head, prevents the automated analyzer from detecting tail recursion.

From what I've read, using a single function head with at top-level `case` expression for pattern matching should result in essentially the same thing as using multiple function heads, once they are compiled. If that's correct, then it seems the analyzer should be able to detect tail recursion in the `case` expression variant shown (commented out) below.

It's also possible that there's a gap in my understanding and having the recursive call "wrapped" in a `case` expression results in a solution that isn't tail-recursive. 😄

```elixir
def encode(dna) do
_encode(dna, <<>>)
end

# The analyzer says this function IS NOT tail recursive
# defp _encode(dna, acc) do
# case dna do
# [] -> acc
# [c | rest] -> _encode(rest, <>)
# end
# end

# The analyzer says this function IS tail recursive
defp _encode([], acc), do: acc
defp _encode([c | rest], acc), do: _encode(rest, <>)
```

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。