簡體   English   中英

將遞歸JS函數轉換為Obj-C

[英]Translate recursive JS function into 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;

}     

不需要該塊。 更直接的翻譯作品:

- (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);
}

看來您已經使用一個塊來解決缺少默認參數值(對於Nresult )的問題,代碼大綱本身沒有什么問題,但是更簡單的方法是使用局部( static )C函數來執行工作。 為此,只需將JS轉換為等效的C,然后使用Objective-C方法調用此C函數,以傳遞Nresult的值。

但是,在這種特殊情況下,您的朋友解決方案要比所需的復雜得多,一個更簡單的算法將產生您的系列。

考慮第一個條件N < 2 ,給定N從零開始,僅對01 在第一種情況下, entry將被設置為0 ,在第二種情況下將被設置為與else分支中的值相同。一種復雜的方法是將序列中的第一個值設置為零。

接下來考慮遞歸; 調用沒有任何復雜的過程,僅增加了一個參數。 遞增值很容易通過迭代完成。

最后,每個遞歸調用都會“從頭開始”計算下一個值,但是該下一個值只是添加了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;
}

高溫超導

暫無
暫無

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

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