2016-04-03 1 views
-1

Ich habe Code, der für max palindrome sucht, alias N = rückwärts (N). Der Code ist noch nicht vollständig. Aber helfen Sie mir, bitte erkundigen Sie sich nach dem Grund der Ausnahme.Ausnahmefehler: keine Übereinstimmung der rechten Seite Wert 2

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). 

Ich bin ständig immer Ausnahme:

** 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) 
+1

Dies ist auch ein Duplikat von http://stackoverflow.com/q/6438041/409228.Haben Sie sich Mühe, SO zu suchen, bevor Sie Ihre Frage stellen? Diese Frage wurde bereits hier mehrmals beantwortet. –

+2

Bevor Sie wissen können, dass es ein Duplikat ist von anderen Fragen über variable Unveränderlichkeit müssen Sie zuerst wissen, dass es um variable Unveränderlichkeit geht und, noch wichtiger, wissen, dass so etwas existiert Dies ist ein Duplikat des ersten Links, aber ich kann nicht sehen, wie es ein Duplikat des zweiten ist. Und Sie müssen die Antwort auf die Frage wissen, bevor Sie sehen, dass es ein Duplikat ist. Sei nett. – dvaergiller

+3

Diese Frage bezieht sich auf einen bestimmten Codeabschnitt, der nicht funktioniert. Die Tatsache, dass die Lösung einer anderen Frage ähnlich ist, macht sie nicht zu einem Duplikat. Viele Fragen können mit derselben oder einer ähnlichen Antwort beantwortet werden, aber es ist die Tatsache, warum eine bestimmte Antwort eine bestimmte Frage beantwortet, die zählt, nicht die Antwort allein. – Amiramix

Antwort

3

Try this in Erlang-Shell:

1> X = 1. 
1 
2> X = X + 1. 
** exception error: no match of right hand side value 2 

Dies liegt daran, in Erlang Variablen nur einmal vergeben werden kann. Es heißt single assignment. Sobald eine Variable an einen Wert gebunden ist, kann diese Variable nicht an einen anderen Wert gebunden werden. Der in einer Variablen gespeicherte Wert kann nicht geändert werden. Sie müssen eine neue Variable erstellen. In diesem speziellen Fall könnten Sie schreiben:

3> Y = X + 1. 
2 
1

Sie sollten wissen, dass = ist wirklich ein Musterabgleich Operator, nicht Zuordnung. Die linke Seite kann ein beliebiges Muster sein, nicht nur eine Variable. Sie können z.B. 2 = 1 + 1 und dies wird erfolgreich übereinstimmen, während 3 = 1 + 1 gibt Ihnen no match of right hand side value 2. Und gebundene Variablen können in dem Muster für ihre Werte verwendet werden, z. X = 2, X = 1 + 1 wird erfolgreich sein.

So in Max = lists:nth(N, List_of_values), weil Max bereits (als Argument der Funktion) gebunden ist, wird der Wert verwendet, und es endet 0 = lists:nth(1, List_of_values) sein (mit Werten von find_palindrome(0, 1, List_of_values, Increment, IfPalindrome), die es sei denn List_of_values beginnt mit 0 fehl.