为什么这个循环崩溃了?

时间:2012-04-12 01:36:29

标签: iphone objective-c xcode ipad loops

我正在尝试构建一种方法,用于在用户点按按钮时计算内部回报率http://www.investopedia.com/articles/07/internal_rate_return.asp#axzz1rm5UPp8V。现金流已存储在名为“cashFlows”的NSMutableArray中。现在在数组中,如果我的值为-100,100,100,100,利率为10%,则可以正常工作。但是当我的值为-5,100,100,100时,程序会崩溃和/或冻结。

我似乎无法弄清楚这一点。我想知道这个方法对于我的计算机是否计算过多,看到该程序可能会循环数百万次。也许有更好的方法来做到这一点?

-(IBAction) calculateIRR{
double NPV;

double rate = 0.1;
int period = 1;
double tempPV = 0;
int count = 0;

do{
    NPV = 0;
    period = 1;
    for (int i=0; i < [cashFlows count]; i++) {
        double amount = ([[cashFlows objectAtIndex:i] doubleValue]);
        if(i == 0){
            NPV = amount;
        } else{
            tempPV = (amount/pow(1+rate,period));
            NPV = tempPV + NPV;
            period++;
        }
    }
    rate = rate + 0.0000001;
    count++;
} while(NPV > 0);

answer.text = [[NSString alloc]  initWithFormat:@"%.4f %%", rate * 100];
}

1 个答案:

答案 0 :(得分:2)

输入值为-5,100,100,100时,IRR为2000%。你的算法必须通过循环运行20亿次!也许在某些时候你的内存耗尽,或者只是花了很多时间。

你应该使用一些更有效的数值算法。我能想到的最简单的是Bisection方法:http://en.wikipedia.org/wiki/Bisection_method

您必须选择合理的起点,但如果解决方案位于间隔之外,还可以添加修改起点的方法(或者中断算法并退出并显示有关不合适输入的警告)。