簡體   English   中英

for循環遞歸

[英]for loops to recursion

我在uni的數據結構課程中學習,並試圖理解它。 我對C中的遞歸和循環有一個大致的了解,但是我很難理解如何在erlang中實現循環。 例如,我在c中的我的程序中有以下循環:

int ii;
double cos_lat[8];    
for(ii = 2, cos_lat[1] = cos(lat); ii <= 7;; ii++)
{
 cos_lat[ii] = cos_lat[1] * cos_lat[ii-1]
}

而且我不知道如何在erlang中實現它。 我知道我必須創建自己的循環定義,例如:

for(Max, Max, F) -> [F(Max)];
for(I, Max, F) -> [F(I)|for(I+1, Max, F)].

(取自實用的erlang)

然后按如下方式調用它:

for(2,7,fun(ii) -> // this is where i get stuck.

我認為我必須在數組(如列表)上使用其他數據結構,但是我不確定如何訪問列表。

感謝您的答復。 只是更新(14/8)。 我試圖對代碼進行遞歸,如下所示:

-module(cos1).
-export([cos_lat/1]).
cos_lat(Base, Iterator, Prev) -> [Base*Prev|cos_lat(Base,Iterator+1,Base*Prev)];
cos_lat(Base, 7, Prev) -> [].

並按如下方式調用它:

cos1:cost_lat(cos(lat),2,cos(lat).

但是它只是不想工作! Erlang確實是一種令人困惑的語言。

讓我們看一下“ for”循環結構。

它包含初始化塊條件塊更新塊 循環具有一個狀態 (開始時實際上是在初始化塊中定義)。 無論您要處理哪種數據結構,因為循環的結構通常都是相同的。 循環狀態封裝了實際的數據結構。

另外,您可能會看到條件塊更新塊通常是循環狀態的功能

使用此信息,讓我們創建通用循環函數:

-module( loops ).
-export( [ for/3 ] ).

for( State, ConditionFunc, LoopFunc ) ->
        case ConditionFunc( State ) of
                true ->
                        NewState = LoopFunc( State ),
                        % next iteration
                        for( NewState, ConditionFunc, LoopFunc );
                false ->
                        % terminate and return
                        State
        end.

例如,使用我們的函數創建一個從1到10的數字列表(在eralng外殼中):

1> c(loops). 
{ok,loops}
2> 
2> ConditionFunc = 
2> fun( { 0, List } ) -> false;
2> ( _ ) -> true 
2> end.
#Fun<erl_eval.6.82930912>
3> 
3> LoopFunc = 
3> fun( { N, List } ) -> { N - 1, [ N | List ] } end. 
#Fun<erl_eval.6.82930912>
4> 
4> { _, Result } = loops:for( { 10, [] }, ConditionFunc, LoopFunc ).
{0,[1,2,3,4,5,6,7,8,9,10]}
5> 
5> Result.
[1,2,3,4,5,6,7,8,9,10]
6> 

這不是創建數字序列的最佳方法,僅用於說明。 總是可以找到更優雅的遞歸解決方案與循環解決方案。 對於我們的示例,下一個解決方案更可取:

seq( A, B ) ->
        my_seq( A - 1, B, [] ).

my_seq( A, A, List ) ->
        List;
my_seq( A, B, List ) ->
        my_seq( A, B - 1, [ B | List ] ).

在外殼中:

1> loops:seq( 1, 10 ).
[1,2,3,4,5,6,7,8,9,10]

或者只是使用標准庫列表中的功能:)

2> lists:seq( 1, 10 ).
[1,2,3,4,5,6,7,8,9,10]

這一點:

for(2,7,fun(ii) -> // this is where i get stuck.

您正在用索引調用您的fun ,但實際上您對索引並不感興趣-您需要在上一次迭代中添加到列表中的值。 您可以將其作為第四個參數傳遞給for函數; 第一次調用它時,需要使用cos(lat)作為種子,並在每個遞歸步驟中使用新值。

以防萬一有人感興趣。 我解決了如下問題:

    -module(cos_lat).
    -export([cos_lat/3]).

     cos_lat(_Base, _Iterator, _Prev) ->
     cos_lat(_Base, _Iterator, _Prev, []).

     cos_lat(_Base,0, _Prev, _Co) ->
     lists:reverse(_Co);

     cos_lat(Base, Iterator, Prev, Co) -> 
     cos_lat(Base, Iterator-1, Base*Prev, [Prev*Base|Co]).

因此,您可以輸入以下內容:

     cos_lat:cos_lat(math:cos(lat),7,math:cos(lat)).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM