我的代码正在寻找最大回文,别名N =反向(N)。代码尚未完成。但请帮助我找出异常的原因。
find_palindrome(List1, List2, Increment, IfPalindrome) ->
List_of_values = [X * Y || X <- List1, Y <- List2],
find_palindrome(0, 1, List_of_values, Increment, IfPalindrome).
find_palindrome(Max, N, List_of_values, Increment, IfPalindrome) ->
case IfPalindrome(lists:nth(N, List_of_values)) of
true ->
case Max < lists:nth(N, List_of_values) of
true ->
Max = lists:nth(N, List_of_values),
find_palindrome(Max, Increment(N), List_of_values, Increment, IfPalindrome);
false ->
find_palindrome(Max, Increment(N), List_of_values, Increment, IfPalindrome)
end;
false ->
find_palindrome(Max, Increment(N), List_of_values, Increment, IfPalindrome)
end.
check_palindrome(N) ->
(N) == (list_to_integer(lists:reverse(integer_to_list(N)))).
problem4() ->
find_palindrome(lists:seq(100, 999), lists:seq(100, 999), fun(X) -> X = X + 1 end, fun check_palindrome/1).
我不断得到例外:
** exception error: no match of right hand side value 2
in function euler4:'-problem4/0-fun-0-'/1 (euler4.erl, line 36)
in call from euler4:find_palindrome/5 (euler4.erl, line 28)
答案 0 :(得分:3)
在Erlang shell中试试这个:
CustomExceptionReporter
这是因为在Erlang中变量只能分配一次。它被称为single assignment。一旦变量绑定到某个值,该变量就不能绑定到任何其他值。存储在变量中的值无法更改。您需要创建一个新变量。在这种特殊情况下,你可以写:
1> X = 1.
1
2> X = X + 1.
** exception error: no match of right hand side value 2
答案 1 :(得分:1)
您应该知道=
实际上是模式匹配运算符,而不是赋值。左侧可以是任何模式,而不仅仅是变量。你可以写例如2 = 1 + 1
这将成功匹配,而3 = 1 + 1
将为您提供no match of right hand side value 2
。并且绑定变量可以在模式中用于它们的值,例如X = 2, X = 1 + 1
将成功。
因此在Max = lists:nth(N, List_of_values)
中,因为Max
已被绑定(作为函数的参数),所以使用了它的值,它最终为0 = lists:nth(1, List_of_values)
(来自{{的值) 1}}除非find_palindrome(0, 1, List_of_values, Increment, IfPalindrome)
以List_of_values
开头,否则将失败。