Tree Functions: Range
Range Range(‹iMax›) generates the list [1, 2, ... , ‹iMax›]. Range(‹iMin›, ‹iMax›) generates the list [‹iMin›, ... , ‹iMax›]. Range(‹iMin›, ‹iMax›, ‹iStep›) uses increment ‹iStep›, with the last element in the result being less or equal to ‹iMax›. ‹iStep› cannot be 0. If ‹iStep› is negative, then the role of ‹iMin› and ‹iMax› are reversed. If Range fails, 0 is returned. Example: Range(5); # returns [1,2,3,4,5] Range(5,10); # returns [5,6,7,8,9,10] Range( 5, 7, 0.3); # returns [5, 5.3, 5.6, 5.9, 6.2, 6.5, 6.8] Range( 5, -4, -2); # returns [5,3,1,-1,-3]
Solutions:
perl
#! perl # this version is written by tilt...@erols.com (Jay Tilton) , 2005-05-15 sub Range { my( $a1, $b1, $dx ) = @_ == 1 ? ( 1, $_[0], 1) : @_ == 2 ? ($_[0], $_[1], 1) : @_; if( $dx == 0 ) { warn "Range: increment cannot be zero."; return; } return [map $a1 + $dx * $_, 0..int( ($b1 - $a1) / $dx )]; }; ########## # test use Data::Dumper; print Dumper(Range(5,-4,-2)); print Dumper(Range2(5,-4,-2));
Python
import math; def Range(iMin, iMax=None, iStep=None): if (iMax==None and iStep==None): return Range(1,iMin) if iStep==None: return Range(iMin,iMax,1) if iMin <= iMax and iStep > 0: if (isinstance(iStep,int) or isinstance(iStep,long)): return range( iMin, iMax+1, iStep) else: return [ iMin+i*iStep for i in range(int(math.floor((iMax-iMin)/iStep))+1) ] if iMin >= iMax and iStep < 0: if (isinstance(iStep,int) or isinstance(iStep,long)): return range( iMin, iMax-1, iStep) else: return [ iMin+i*iStep for i in range(int(math.floor((iMin-iMax)/-iStep))+1) ] # # raise error about bad argument return [] # test print Range(5,9,-2)
scheme lisp
; scheme ; code by Jussi Piitulainen jpiit...@ling.helsinki.fi 2005-05 ;;; Increasing list of b+ks in the interval [b..e) if s > 0. ;;; Decreasing list of b+ks in the interval (e..b] if s < 0. (define (range b e s) (do ((k (- (ceiling (/ (- e b) s)) 1) (- k 1)) (r '() (cons (+ b (* k s)) r))) ((< k 0) r))) ; test (display (range 3 5 1/2)) ; Note this code is very much incorrect.
Java
// 2005 import java.util.List; import java.util.ArrayList; import java.lang.Math; class math { public static List range(double n) { return range(1,n,1); } public static List range(double n, double m) { return range(n,m,1); } public static List range(double iMin, double iMax, double iStep) { List ll = new ArrayList(); if (iMin <= iMax && iStep > 0) { for (int i=0; i <= Math.floor((iMax-iMin)/iStep); i++) { ll.add(new Double(iMin+i*iStep)); } return ll; } if (iMin >= iMax && iStep < 0) { for (int i=0; i <= Math.floor((iMin-iMax)/-iStep); i++) { ll.add(new Double(iMin+i*iStep)); } return ll; } // need to raise exception here return ll; } } class Range { public static void main(String[] arg) { System.out.println(math.range(5)); System.out.println(math.range(5,10)); System.out.println(math.range(5,7, 0.3)); System.out.println(math.range(5,-4, -2)); } }