Quantcast
Viewing latest article 15
Browse Latest Browse All 27

Rabbits and Recurrence Relations

Problem
A sequence is an ordered collection of objects (usually numbers), which are allowed to repeat. Sequences can be finite or infinite. Two examples are the finite sequence (Π,−√2,0,Π) and the infinite sequence of odd numbers (1,3,5,7,9,…). We use the notation an to represent the n-th term of a sequence.

A recurrence relation is a way of defining the terms of a sequence with respect to the values of previous terms. In the case of Fibonacci's rabbits from the introduction, any given month will contain the rabbits that were alive the previous month, plus any new offspring. A key observation is that the number of offspring in any month is equal to the number of rabbits that were alive two months prior. As a result, if Fn represents the number of rabbit pairs alive after the n-th month, then we obtain the Fibonacci sequence having terms Fn that are defined by the recurrence relation Fn=Fn-1+Fn-2 (with F1=F2=1 to initiate the sequence). Although the sequence bears Fibonacci's name, it was known to Indian mathematicians over two millennia ago.

When finding the n-th term of a sequence defined by a recurrence relation, we can simply use the recurrence relation to generate terms for progressively larger values of n. This problem introduces us to the computational technique of dynamic programming, which successively builds up solutions by using the answers to smaller cases.

Given: Positive integers n≤40 and k≤5.

Return: The total number of rabbit pairs that will be present after n months if each pair of reproduction-age rabbits produces a litter of k rabbit pairs in each generation (instead of only 1 pair).

Sample Dataset
5 3

Sample Output
19

It is very intuitive to implement Fibonacci sequence using recursive algorithm. But it's performance is poor with O(2n). This problem requires using dynamic programming, which caches answers to smaller cases that were calculated previous, to optimize performance.

I have presented an R version of Fibonacci, which employ a local global vector to cache the previous results. In C, I use a static variable to do the same thing. Actually this program is translated from the R implementation.

NOTE: unsigned long int was used to store Fibonacci numbers, since they increase quite fast.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
 
#define MAXSIZE 41
 
unsigned long int fib(int n, int k);
 
int main() {
  int n, k;
  FILE *INFILE;
  INFILE = fopen("../DATA/rosalind_fib.txt", "r");
  fscanf(INFILE, "%d %d", &n, &k);
  printf("%lu\n", fib(n, k));
  return 0;
}
 
unsigned long int fib(int n, int k) {
  static unsigned long int cache[MAXSIZE] = {0,1,1,0,};
  if (cache[n] == 0)
    cache[n] = fib(n-1, k) + k * fib(n-2,k);
  return cache[n];
}

Related Posts


Viewing latest article 15
Browse Latest Browse All 27

Trending Articles