2014-11-24 5 views
2
다음 파이썬 코드에 얼랑 상응하는 무엇

:으로 반복

for x in range(9): 
    for y in range(9): 
     for z in range(9): 
      foo(x, y, z) 

내가 다음 C = [{X,Y,Z} || X<- lists:seq(1,9), Y<- lists:seq(1,9), Z<- lists:seq(1,9)]foo([])->done; foo([H|T])->blah blah.

어떻게 먼저 제품을 생성 할 수 있습니다 알고는 재귀 만 사용하는 보조 목록없이합니까?

답변

1

세 가지 재귀 함수로 수행 할 수 있습니다.

당신은 기능 머리에 일부 복잡한 패턴 매칭 함께 할 수 있습니다. 보조 목록의 작성을 생략 할 수

그러나 가장 쉬운 방법은

C = [foo(X, Y, Z) || X<- lists:seq(1,9), 
        Y<- lists:seq(1,9), 
        Z<- lists:seq(1,9)] 

경우 foo/3 과정을 하나 개의 요소 지능형리스트 내에서 함수를 호출하는 것입니다.

0

목록 이해는 여전히 메모리에 보조 목록을 만들 수 강제로. 거대한 데이터 세트를 다루는 경우에는 피해야합니다. 재귀 함수를 매번 작성하는 것은 어색하기 때문에 함수에 대한 제네릭 자체를 제안했습니다. 직접 재귀 나 목록 이해보다 트래버스 속도가 약간 느리지 만 메모리가 안정하고 일반적이며 사용하기 쉽습니다.

사용법 :

(for({10}))(
    fun (X) -> io:format("~p ",[X]) end). 
> 1 2 3 4 5 6 7 8 9 10 

(for({10, -10, -2}))(
    fun (X) -> io:format("~p ",[X]) end). 
> 10 8 6 4 2 0 -2 -4 -6 -8 -10 

너무 목록과 작품 :

(for(lists:seq(10, -10, -2)))(
    fun (X) -> io:format("~p ",[X]) end). 
> 10 8 6 4 2 0 -2 -4 -6 -8 -10 

이 함수로 단계 또는 가드 정의 할 수도 있습니다 : 당신이 위해에 전달하면

(for({256, 1.1, fun (X) -> math:sqrt(X) end, fun (X, Range) -> X > Range end}))(
    fun (X) -> io:format("~p ",[X]) end). 
> 256 16.0 4.0 2.0 1.4142135623730951 1.189207115002721 

을 두 개의 매개 변수 함수, 그럼 당신은 목록과 같은 accumulator 기능을 사용할 수 있습니다 : foldl/3.

Fact = (for(1, {1, 5}))(
    fun(X, Acc) -> 
     X * Acc 
    end), 
io:format("~p", [Fact]). 
> 120 

e_fact(N) -> 
    {_, E} = (for({1, 1}, {1, N}))(% i assumed 1/0! equals 1 
    fun(X, {LastFact, Sum}) -> 
     Fact = LastFact * X, 
     {Fact, Sum + 1/Fact} 
    end), 
    E. 
io:format("e=~p", [e_fact(10)]). 
> e=2.7182818011463845 

또한 초기 누적기를 전달해야합니다. 단계 및 가드 기능은 누적기에 의존 할 수 있습니다. 하나의 매개 변수로 함수를 전달하십시오. 피타고라스 수를 찾는

중첩 루프. 종결 용이 :

pyth_lists(N) -> 
    [io:format("~p ", [{A, B, C}]) || 
    A <- lists:seq(1, N), 
    B <- lists:seq(A + 1, N), 
    C <- lists:seq(B + 1, N), 
    A * A + B * B == C * C]. 

pyth_for(N) -> 
    (for({1, N}))(
    fun(A) -> 
     (for({A + 1, N}))(
     fun(B) -> 
      (for({B + 1, N}))(
      fun(C) -> 
       case A * A + B * B == C * C of 
       true -> io:format("~p ", [{A, B, C}]); 
       false -> ok 
       end 
      end) 
     end) 
    end). 

외부 저장소에는 너무 작습니다. 나는 그것을 유틸리티 모듈에 보관한다. 도움이 될만한 코드는 다음과 같습니다.