# NAME

Math::Recaman - Calculate numbers in Recamán's sequence

# SYNOPSIS

```
use Math::Recaman qw(recaman);
recaman(100); # print the first 100 numbers in Recamán's sequence
recaman(1000, sub { push @nums, shift }); # collect the first 1000 numbers into an array
my @array = recaman(10); # Returns the first 10 Recaman numbers as an array
```

# DESCRIPTION

Recamán's sequence is a well known sequence defined by a recurrence relation.

It is named after its inventor, Colombian mathematician Bernado Recamán Santos by Neil Sloane, creator of the On-Line Encyclopedia of Integer Sequences (OEIS). The OEIS entry for this sequence is A005132.

The sequence is defined as

```
aₙ = 0 if n = 0
aₙ = aₙ₋₁ - n if aₙ₋₁ - n > 0 and is not already in the sequence
aₙ = aₙ₋₁ + n otherwise
```

It is known to produce quite aethetically pleasing outputs if plotted as an image or as music.

See more:

# METHODS

## recaman <target> [callback]

Takes a target number to calculate to. If nothing is given the method returns immediately.

By default it prints each number out on a new line.

You can optionally pass in a anonymous subroutine which will be called for each new number in the sequence with the arguments `number`

, `count`

and `max seen so far`

.

If you do not pass an anonymous subroutine and if you call this subroutine expecting an array in return then nothing will be printed.

## recaman_a008336 <target> [callback]

There is another sequence invented by Recamán, less known, defined as:

```
a₁ = 1
aₙ₊₁ = aₙ/n if n divides aₙ
aₙ₊₁ = naₙ otherwise
```

Takes a target number to calculate to. If nothing is given the method returns immediately.

By default it prints each number out on a new line.

You can optionally pass in a anonymous subroutine which will be called for each new number in the sequence with the arguments `number`

, `count`

and `max seen so far`

.

If you do not pass an anonymous subroutine and if you call this subroutine expecting an array in return then nothing will be printed.

# Using Set::IntSpan

If the module Set::IntSpan is installed then that will be used for keeping track of the sequence.

This should make it more efficient for very long sequences.

You can check to see if the module is using Set::IntSpan by checking the variable `$Math::Recaman::USING_INTSPAN`

.

You can disable using the module even if it's installed by setting the variable `$Math::Recaman::USING_INTSPAN`

to `0`

before calling the `recaman`

function.

# AUTHOR

Simon Wistow, `<simon at thegestalt.org>`

# BUGS

Please report any bugs or feature requests to `bug-math-recaman at rt.cpan.org`

, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Math-Recaman. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

You can also open issues on GitHub at https://github.com/simonwistow/Math-Recaman.

# VERSION

Version 0.01

# SUPPORT

You can find documentation for this module with the perldoc command.

` perldoc Math::Recaman`

You can also look for information at:

RT: CPAN's request tracker (report bugs here)

CPAN Ratings

Search CPAN

GitHub

# LICENSE AND COPYRIGHT

This software is Copyright (c) 2024 by Simon Wistow.

This is free software, licensed under:

` The Artistic License 2.0 (GPL Compatible)`