Introduction to Computer Science - Fall 2004
/*
Module: twoton.c
Author: Yana

What:
-----
This program computes 2^n in four recursive ways.
Input: an integer n.
Output: 2^n.

How:
----
Algorithm: Four recursive algorithms - See functions.
notice the different complexity of the 4 versions.
*/

#include<stdio.h>

int Version1(int n);
int Version2(int n);
int Version3(int n);
int Version4(int n);

int main(){

    int n; /* input number. */
    printf( "Enter a number: ") ;
    scanf("%d", &n);
    printf("Version 1 = %d, Version 2 = %d, Version 3 = %d, Version 4 = %d\n", Version1(n), Version2(n), Version3(n), Version4(n));

    return 0;
}

/* Algorithm: 2^n = 2^(n-1) + 2^(n-1) */

int Version1(int n){

    if (n == 0)
      return 1;
    else
      return (Version1(n-1) + Version1(n-1));
}

/* Algorithm: 2^n = 2 * 2^(n-1). */

int Version2(int n){

    if (n == 0)
      return 1;
    else
      return 2*Version2(n-1);
}

/* Algorithm: 2^n = 2^(n/2) * 2^(n/2) if n is even.
2^n = 2 * 2^(n/2) * 2^(n/2) if n is odd. */

int Version3(int n){

    int result; /* result up to a factor of two. */

    if (n == 0)
      return 1;
    result = Version3(n/2) * Version3(n/2);
    if (n % 2 == 0)
      return result;
    else
      return 2*result;
}

/* Algorithm: 2^n = (2^(n/2))^2 if n is even.
2^n = 2*(2^(n/2))^2 if n is odd. */

int Version4(int n){

    int temp; /* almost sqrt of result. */

    if (n == 0)
      return 1;
    temp = Version4(n/2);
    if (n % 2 == 0)
      return temp * temp;
    else
      return 2 * temp * temp;
}