/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package recursion;

/**
 *
 * @author kvaradar
 */
public class Recursion {
    
    static boolean binarySearch(int [] A, int i, int j, int x) {
        // does A[i..j] contain x? A is sorted
        if (i==j) return (A[i] == x);
        
        int k = (i + j)/2;
        if (x == A[k]) {
            return true;
        }
        else if (x < A[k]) {
            // look for x in A[i..(k-1)]
            return binarySearch(A, i, k-1, x);
        }
        else {
            //look for x in A[k+1..j]
            return binarySearch(A, k+1, j, x);
        }
        
    }
    
    static void reverse(int [] A) {
        recReverse(A, 0, A.length - 1);
    }

    static void recReverse(int [] A, int i, int j) {
        //reverse A[i..j]
        if (i < j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
        // swapped A[i] and A[j]
        recReverse(A, i+1, j-1);// tail recursion
        }
    }
    
    static long binaryFib(int n) {
        //return nth Fibonacci number
        if (n <= 1) return n;
        return binaryFib(n-1) + binaryFib(n-2);
    }
    
    private static void fix(int [] arr, int index) {
        
        int temp;
        
        while((index > 0) && (arr[index - 1] < arr[index])) {
            temp = arr[index];
            arr[index] = arr[index-1];
            arr[index - 1] = temp;
            
            index--;
        }
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        int [] B = {10, 20, 30, 45, 50, 60, 80};
        System.out.println(binarySearch(B, 0, B.length - 1, 34));
        reverse(B);
        
        int [] C = {4, 4, 3, 3, 2, 2, 2, 1, 1};
        C[6] = 3;
        fix(C,6);
    }
}
