2017-09-10 11 views
0

私の友人は、いくつかの条件に基づいて系列を作成しようとしている計算上の問題を解決するのを助けました。彼は再帰でJSを使用しました。私はこれをObj-Cに翻訳して座り込み、困惑しています。再帰的JS関数をObj-Cに変換する

私は以下の出発点を持っています。アイデアは、再帰的なブロックを使用することでした、それは正しいアプローチですか?ブロックと再帰は私の周りに頭を上げるのは本当に難しいです。下のスケルトンは正しいトラックにありますか?

JSバージョン

function series(F, S, Y, N = 0, result = []) { 
    var entry 

    if (N < 2) { 
    entry = N * (F + S * (N - 1)) 
    } else { 
    entry = (F + S * (N - 1)) 
    } 

    if (entry > Y) { 
    return result 
    } 

    result.push(entry) 

    return series(F, S, Y, N + 1, result) 
} 

// series (90, 30, 200) 
// (5) [0, 90, 120, 150, 180] 

のObj-Cバージョンの試みの開始 - 申し訳ありませんが、これはブロックの必要はありません醜い

-(NSArray*) seriesWithF:(int)_F S:(int)_S Y:(int)_Y { 

int F = _F; 
int S = _S; 
int Y = _Y; 
int N = 0; 
NSMutableArray* result = [NSMutableArray init]; 

    __block void (^series)(int, int, int, int, NSMutableArray*) =^void (int F, int S, int Y, int N, NSMutableArray* result) 
    { 

    // logic 
    int entry = [result of logic] 
    [result addObject:[NSNumber initWithInt:entry]]; 

    series(F, S, Y, N, result); 

    } 

series(F, S, Y, N, result); 
return result; 

}  

答えて

1

です。はるかに直接的な翻訳作品:

- (NSArray *)series:(int)f s:(int)s y:(int)y n:(int)n result:(NSArray *)result { 
    int entry; 
    if (n < 2) { 
     entry = n * (f + s * (n - 1)); 
    } else { 
     entry = (f + s * (n - 1)); 
    } 

    if (entry > y) { 
     return result; 
    } 

    NSMutableArray *newResult = [result mutableCopy]; 
    [newResult addObject:@(entry)]; 

    return [self series:f s:s y:y n:n+1 result:newResult]; 
} 

- (void)someOtherMethod { 
    NSArray *result = [self series:90 s:30 y:200 n:0 result:@[]]; 
    NSLog(@"Result = %@", result); 
} 
+0

ところで:私は、法の必要性が表示されません。どちらも、それを 'NSArray'の関数またはメソッドにする必要があり、最後のパラメータは省略します。少なくともそれはクラスメソッドでなければなりません。 (そして、NSArrayクラスのメソッドとメソッドをまとめておけば、便利なアロケータのように見えます)。 –

0

あなたは(Nresultのための)デフォルトのパラメータ値の不足に対処するためにブロックを使用しているように見え、それ自体があなたのコードのアウトラインと間違って何もありませんが、より簡単な方法は、ローカル(static)C関数を使用してジョブを実行することです。これを行うには、JSを同等のCに変換し、次にObjective-Cメソッドを使用して、このC関数を、Nresultの値を渡して呼び出します。

しかし、この特定のケースでは、あなたの友人のソリューションは必要以上に複雑であり、はるかに簡単なアルゴリズムがシリーズを生成します。

はゼロで N開始を与えられた最初の条件、 N < 2は、ちょうど 0 & 1のためにtrueになります考えてみましょう。最初のケースでは、 entry0に設定され、2番目の値は elseブランチと同じ値になります。シーケンスの最初の値を0に設定する複雑な方法。

次に、再帰について考えます。呼び出しに複雑なものは何もなく、ただ1つのパラメータがインクリメントされます。値を増やすことは反復で簡単に実行できます。

最後に、各再帰呼び出しは "ゼロから"次の値を計算しますが、その次の値はそれに加えてSが追加された直前の値です。繰り返しもこれに適しています。これらの観察に基づいて

はのは、単純化してみましょう:

- (NSArray *) seriesWithF:(int)F S:(int)S Y:(int)Y 
{ 
    NSMutableArray *result = [NSMutableArray new]; 
    [result addObject:@(0)];  // you always start with zero 

    int entry = F;     // next value is F 
    while (entry <= Y)    // iterate as long as in range 
    { 
     [result addObject:@(entry)]; // add to sequence 
     entry += S;     // increment 
    } 

    return result; 
} 

HTH

関連する問題