haskell prelude
François Sarradin
fsarradin at gmail.com
Sat Jun 23 13:55:00 PDT 2012
David,
Even with BigInteger, you cannot have an infinite stream ;)
Nice implem though ^^
About note 1, you not only need tuples but also destructuration.
françois-
Le 23 juin 2012 03:22, "David Conrad" <drconrad at gmail.com> a écrit :
>
>
> On Fri, 22 Jun 2012 22:37:41 +0200, Fran?ois Sarradin <fsarradin at gmail.com
> > wrote:
>
>>
>> Here is a copy of source code I have written once to produce fib numbers
>> as
>> an infinite stream. It uses an Iterator (as Brian has proposed).
>>
>> @Test
>> public void shouldGetFibonacciNumbersAsInfiniteStream() {
>> Iterator<Integer> fibIterator = new AbstractIterator<Integer>() {
>> int a = 1;
>> int b = 0;
>>
>> @Override
>> protected Integer computeNext() {
>> Integer result = b;
>> b = a + b;
>> a = result;
>> return result;
>> }
>> };
>>
>> assertThat(limit(fibIterator, 8)).containsOnly(0, 1, 1, 2, 3, 5,
>> 8, 13);
>> }
>>
>>
> François,
>
> Not really an infinite sequence unless you use BigInteger, is it? :)
>
> import java.util.Iterator;
> import java.math.BigInteger;
> import static java.math.BigInteger.ONE;
> import static java.math.BigInteger.ZERO;
>
> public class Fibo {
> private Fibo() {
> throw new AssertionError("no instances");
> }
>
> public static Iterable<BigInteger> nacci() {
> return new Iterable<BigInteger>() {
> @Override public Iterator<BigInteger> iterator() {
> return new Iterator<BigInteger>() {
> private BigInteger a = ONE, b = ZERO;
>
> @Override public boolean hasNext() { return true; }
>
> @Override public BigInteger next() {
> set(a.add(b), a); // Note 1
> return b;
> }
>
> private void set(BigInteger a, BigInteger b) {
> this.a = a; this.b = b;
> }
> };
> }
> };
> }
> }
>
>
> import in.digo.func.Take;
> import java.math.BigInteger;
> import static java.math.BigInteger.ZERO;
> import static java.math.BigInteger.TEN;
>
> public class Fib {
> public static void main(String[] args) {
> BigInteger googol = TEN.pow(100);
> System.out.printf("%,d%n",
> Take.whileTrue(n -> n.compareTo(googol) <= 0, Fibo.nacci())
> .reduce(ZERO, (a, b) -> a.add(b))); // Note 2
> }
> }
>
> $ time java Fib
>
> 24,130,015,357,889,614,840,807,962,620,028,350,479,216,011,277,190,196,743,261,610,776,878,424,511,662,841,261,217,058,994,930,287,040
>
> real 0m0.234s
> user 0m0.030s
> sys 0m0.061s
>
> Sum of all terms of the Fibonacci sequence up to a googol.
>
> Note 1: What I really want to write is a, b = a + b, a, but Java doesn't
> have tuples (yet?)
> Is there a bug I can vote for on that? :)
>
> Note 2: Take.whileTrue omitted for brevity, but it does what the name
> implies.
>
> A plus, et bon weekend,
> David
>
>
More information about the lambda-dev
mailing list