0

「シグマ表記は合計の省略形です。ここでの使用は、1/2^i の値を加算することを意味します。ここで、i は 1 から n まで変化します。つまり、1/2 + 1/4 + 1/8 を加算します.. .. n の値を十分に大きくすると、この数列の合計は 1 に近づくはずです。n のさまざまな値を試して、どれだけ近づくか見てみましょう。

#import <Foundation/Foundation.h>
// Define the Fraction class
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
@property int numerator, denominator;
-(void) print;
-(void) setTo: (int) n over: (int) d;
-(Fraction*) add: (Fraction *) f;
-(void) reduce;
@end    

#import "Fraction.h"
@implementation Fraction
@synthesize numerator, denominator;
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(void) setTo: (int) n over: (int) d
{
numerator = n;
denominator = d;
}
-(Fraction *) add: (Fraction *) f
{
// To add two fractions:
// a/b + c/d = ((a*d) + (b*c)) / (b * d)
// result will store the result of the addition
Fraction *result = [[Fraction alloc] init];
result.numerator = numerator * f.denominator +
denominator * f.numerator;
result.denominator = denominator * f.denominator;
[result reduce];
return result; 
}

#import "Fraction.h"
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *aFraction = [[Fraction alloc] init];
Fraction *sum = [[Fraction alloc] init], *sum2;
int i, n, pow2;
[sum setTo: 0 over: 1]; // set 1st fraction to 0
NSLog (@"Enter your value for n:");
scanf ("%i", &n);
pow2 = 2;

for (i = 1; i <= n; ++i) {
[aFraction setTo: 1 over: pow2];
sum2 = [sum add: aFraction];
[sum release]; // release previous sum
sum = sum2;
pow2 *= 2;
}

NSLog (@"After %i iterations, the sum is %g", n, [sum convertToNum]);
[aFraction release];
[sum release];
[pool drain];
return 0;
}

質問: 「for」ループで使用している追加の変数 sum2 を作成する必要があるのはなぜですか? ここで「前の合計を解放」して、解放したばかりの値を再び与える必要があるのはなぜですか? :

sum2 = [sum add: aFraction];
[sum release]; // release previous sum
sum = sum2;

メモリリークを避けるためだけですか?(メソッド「add」は、sum2 に格納されている変数を初期化します)

4

2 に答える 2