我的疑惑在于这两个函数中的Range匹配
我测试如下代码是可以执行的(分段查找):
defmodule Chop do
def guess(actual, range = low..high) do
guess = div(low+high, 2)
IO.puts "Is it #{guess}?"
_guess(actual, guess, range)
end
defp _guess(actual, actual, _),
do: IO.puts "Yes, it's #{actual}"
defp _guess(actual, guess, _low..high)
when guess < actual,
do: guess(actual, guess+1..high)
defp _guess(actual, guess, low.._high)
when guess > actual,
do: guess(actual, low..guess-1)
end
Chop.guess(271, 1..1000)
"""
Is it 500?
Is it 250?
Is it 375?
Is it 312?
Is it 281?
Is it 265?
Is it 273?
Is it 269?
Is it 271?
Yes, it's 271
"""
不懂 _low..high 和 low.._high 是如何执行匹配的,比如传入区间 1..50,
匹配效果是不一样的吗?求解答,非常感谢?。
That's easy. 我給你翻譯下這段歌詞:
這個程式在邏輯上是等價的, 雖然一個是
條件語句
, 一個是pattern matching
.其實
它就是一個
pattern matching
, 只是你需要意識到把guess > actual
,guess > actual
, 以及其它任意情況(在這裏就只剩下相等啦)是作爲match的條件而存在的.你也可以自己改寫成另一種
pattern matching
, 即case guess do
形式, 這兩者是完全等價的, 只是看自己的品味, 窩寫standard ml的時候更喜歡case
哈.可能你對
pattern matching
還不熟悉, 多寫寫就行啦, elixir的精華之一是pattern matching
, 你以後可以儘可能的用patter matching
, 有些時候會比較燒腦, 比起定義本地變量(典型的如sml中的let in
)也可能會效率低些(因爲很多情況會以無法使用尾遞歸爲代價), 但是會非常簡潔, 非常具有美感, 好好發現elixir的美吧, 掃年, functional programming的大門在等着你打開