我正在学习Elixir,我正在研究Project Euler,试图加强我在Elixir的技能。现在我有这个代码
df = pd.DataFrame(np.random.choice(list('ABCDE'), 100), columns=['strings'])
df.head()
strings
0 B
1 A
2 B
3 E
4 D
5 C
6 E
7 D
8 D
9 D
test_string = 'A'
df.loc[df[df['strings'].str.contains(test_string)].index.union(df[df['strings'].str.contains(test_string).shift().fillna(False)].index)]
但是当我运行这段代码时,我得到了:
strings
1 A
2 B
11 A
12 A
13 D
18 A
19 C
36 A
37 C
42 A
43 E
44 A
45 C
51 A
52 B
56 A
57 A
58 A
59 C
62 A
63 D
69 A
70 E
73 A
74 E
96 A
97 A
98 B
我该如何解决这个问题?
答案 0 :(得分:7)
Elixir目前不允许定义匿名递归函数。你有两个选择:在任何模块中使用[opcache.revalidate_freq] => 60
定义一个普通函数,或者使用下面的技巧(hack?)来制作一种匿名递归函数:
def
我建议在模块中定义此函数,而不是使用此hack:
fib = fn
fib, a, b, 0 -> a
fib, a, b, n -> fib.(fib, b, a+b, n-1)
end
IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> fib.(fib, 0, 1, n) end), fn(x) -> rem(x, 2) == 0 && x < 4000000 end))
注意:defmodule Fib do
def fib(a, _b, 0), do: a
def fib(a, b, n), do: fib(b, a + b, n - 1)
end
IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> Fib.fib(0, 1, n) end), fn(x) -> rem(x, 2) == 0 && x < 4000000 end))
的第二个参数中也存在语法错误,我已修复(希望正确)。
提示:请阅读有关管道运算符的内容,以使Enum.filter/2
代码更加惯用:http://elixir-lang.org/getting-started/enumerables-and-streams.html#the-pipe-operator