fib(N)->
P1 = spawn(fun concFib:conFib/0),
P2 = spawn(fun concFib:conFib/0),
X=rpc(P1,N-2),Y=rpc(P2,N-1),X+Y.
conFib()->
receive
{Client,N} -> Client ! regfib(N)
end.
rpc(Pid,Request)->
case erlang:is_process_alive(Pid) of
true -> begin
Pid ! {self(),Request},
receive
{Pid,Respond} -> Respond
end
end;
false -> io:format("~w process is dead.",[Pid])
end.
regfib(N)->
case N<2 of
true -> 1;
false -> regfib(N,1,1,1)
end.
regfib(N,N,X,_)-> X ;
regfib(N,M,X,Y)-> regfib(N,M+1,X+Y,X).
L'idée est de diviser le processus de fib (N) en deux processus calcule une fib (N-2) et l'autre calc. fib (N-1) en même temps que fib (N) = fib (N-1) + fib (N-2). quand je cours le code précédent, rien ne se passe et le curseur s'arrête comme dans une boucle finie ou en attente d'un résultat qui n'atteint pas.
plzzz j'ai besoin d'aide je suis un nouveau programmeur Erlang, merci d'avance :)Pourquoi ce code erlang ne fonctionne-t-il pas?
Vous ne savez pas quelle est votre intention avec ce code, mais notez que X et Y ne sont pas calculés en parallèle. – Zed
Je veux calculer X et Y en parallèle, c'est mon intention. – Fuzzix
Maintenant, votre flux d'appels est fondamentalement send-to-1, receive-from-1, send-to-2, recive-from-2, où receive fait votre bloc de code. Vous devriez changer ceci pour envoyer-à-1, envoyer-à-2, recevoir-de-1, recevoir-de-2. – Zed