Horner's rule for polynomial evaluation: Difference between revisions

→‎{{header|OCaml}}: ++ obj-c (overcomplicated?)
(Added PicoLisp)
(→‎{{header|OCaml}}: ++ obj-c (overcomplicated?))
Line 178:
show horner 3 [-19 7 -4 6] ; 128</lang>
 
 
=={{header|Objective-C}}==
<lang objc>#import <Foundation/Foundation.h>
 
typedef double (*mfunc)(double, double, double);
 
double accumulateFunc(double s, double x, double a)
{
return s * x + a;
}
 
@interface NSArray (HornerRule)
- (double)horner: (double)x;
- (NSArray *)reversedArray;
- (double)injectDouble: (double)s xValue: (double)x with: (mfunc)op;
@end
 
@implementation NSArray (HornerRule)
- (NSArray *)reversedArray
{
NSMutableArray *array = [NSMutableArray arrayWithCapacity: [self count]];
NSEnumerator *e = [self reverseObjectEnumerator];
id el;
while( (el = [e nextObject]) != nil) {
[array addObject: el];
}
return array;
}
 
 
- (double)injectDouble: (double)s xValue: (double)x with: (mfunc)op
{
double sum = s;
NSEnumerator *e = [self objectEnumerator];
id el;
while( (el = [e nextObject]) != nil) {
sum = op(sum, x, [el doubleValue]);
}
return sum;
}
 
- (double)horner: (double)x
{
return [[self reversedArray] injectDouble: 0.0 xValue: x with: (mfunc)accumulateFunc ];
}
@end
 
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
NSArray *coeff = [NSArray
arrayWithObjects:
[NSNumber numberWithDouble: -19.0],
[NSNumber numberWithDouble: 7.0],
[NSNumber numberWithDouble: -4.0],
[NSNumber numberWithDouble: 6.0], nil];
printf("%lf\n", [coeff horner: 3.0]);
 
[pool release];
return 0;
}</lang>
 
=={{header|OCaml}}==