Elixir递归函数返回nil而非预期列表问题求助
问题原因分析
你的递归函数返回nil的核心原因是函数第一个子句的返回值逻辑错误:
Elixir 中if和unless都是表达式(而非语句),它们的返回值会作为所在代码块的结果。在你的代码里,if和unless是两个独立执行的表达式:
- 当
head > 3时,if块会执行递归调用,但这个调用的结果没有被作为函数返回值;紧接着执行unless,此时head > 3为真,unless的条件不满足,因此unless返回nil,这就成了当前函数子句的最终返回值。 - 当递归到终止子句时,虽然正确返回了拼接好的结果列表,但这个结果只会返回到上一层的
if或unless块中,而不会成为整个函数的最终返回值——因为上层函数最后执行的unless或if已经返回了nil,正确结果被直接丢弃。
修正方案
方案1:修复递归逻辑(合并if/unless为if...else)
把独立的if和unless合并成if...else结构,让函数始终返回递归调用的结果:
defmodule Logic do def is_bigger_then_3(list_int, res) when length(list_int) > 0 do [head | tail] = list_int if head > 3 do is_bigger_then_3(tail, res ++ [true]) else is_bigger_then_3(tail, res ++ [false]) end end def is_bigger_then_3(_list_int, res) do res end end
方案2:更符合Elixir习惯的写法(用内置Enum.map)
Elixir 内置了Enum.map/2专门处理列表元素映射场景,完全不需要手动写递归:
defmodule Logic do def is_bigger_then_3(list_int) do Enum.map(list_int, &(&1 > 3)) end end
调用示例:
iex> Logic.is_bigger_then_3([1,2,3,4]) [false, false, false, true]
内容的提问来源于stack exchange,提问作者mr.w1sh
相关产品推荐
相关产品推荐

