2013-06-25 24 views

回答

0

DDMathParser作者在這裏。

的所有功能的基本特徵是:

DDExpression* ^(NSArray *arguments, NSDictionary *variables, DDMathEvaluator *evaluator, NSError **error); 

所以,你需要創建這些塊實現NCR的算法之一。有幾種方法可以做到這一點:

  1. 您可以完全按照文章中所示的那樣來實現函數,計算階乘,進行相減,並進行除法運算。
  2. 您可以完全根據現有的因子,減法和除法函數來實現函數。
  3. 你可以做兩者的組合。

就個人而言,我建議最後一個,因爲it saves having to re-evaluate the arguments,但也意味着你不必自己編寫大部分邏輯。

它會是這樣的:

DDMathFunction nCrFunction = ^(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError **error) { 
    if ([args count] != 2) { 
    *error = [NSError errorWithDomain:DDMathParserErrorDomain code:DDErrorCodeInvalidNumberOfArguments userInfo:@{NSLocalizedDescriptionKey : @"nCr requires 2 arguments"}]; 
    return nil; 
    } 

    DDExpression *first = [args objectAtIndex:0]; 
    DDExpression *second = [args objectAtIndex:1]; 

    NSNumber *n = [first evaluateWithSubstitutions:vars evaluator:eval error:error]; 
    if (n == nil) { return nil; } 

    NSNumber *k = [second evaluateWithSubstitutions:vars evaluator:eval error:error]; 
    if (k == nil) { return nil; } 

    // some validation here to guarantee that 0 ≤ k ≤ n 

    // now, re-box the numbers in expressions to pass off to other functions 
    DDExpression *nExpression = [DDExpression numberExpressionWithNumber:n]; 
    DDExpression *kExpression = [DDExpression numberExpressionWithNumber:k]; 

    // build the algorithm 
    DDExpression *f1 = [DDExpression functionExpressionWithFunction:DDOperatorFactorial arguments:@[kExpression] error:error]; // k! 

    // the other half of the denominator 
    DDExpression *subtract = [DDExpression functionExpressionWithFunction:DDOperatorMinus arguments:@[nExpression, kExpression] error:error]; // (n-k) 
    DDExpression *f2 = [DDExpression functionExpressionWithFunction:DDOperatorFactorial arguments:@[subtract] error:error]; // (n-k)! 

    // the full denominator 
    DDExpression *denominator = [DDExpression functionExpressionWithFunction:DDOperatorMultiply arguments:@[f1, f2] error:error]; // k!(n-k)! 

    // the numerator 
    DDExpression *numerator = [DDExpression functionExpressionWithFunction:DDOperatorFactorial arguments:@[nExpression] error:error]; // n! 

    // the whole thing 
    DDExpression *final = [DDExpression functionExpressionWithFunction:DDOperatorDivide arguments:@[numerator, denominator] error:error]; // n!/(k!(n-k)!) 

    return final; 
}; 

在該塊,您可以在DDMathEvaluator註冊功能:

[[DDMathEvaluator sharedMathEvaluator] registerFunction:nCrFunction forName:@"nCr"]; 

這就是它!

現在你可以這樣做:

NSNumber *n = [@"nCr(4, 3)" numberByEvaluatingString]; 

警告:在瀏覽器中輸入的,而不是編譯代碼。 買者實施者


順便說一句,如果這是你希望看到的內置到DDMathParser,請open a new issue在Github上,在一個功能。