异常错误:右侧值2不匹配

时间:2016-04-03 06:34:30

标签: erlang

我的代码正在寻找最大回文,别名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)

2 个答案:

答案 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开头,否则将失败。