chore(Java): add recursion algorithms (#636)
parent
25b0c63a8e
commit
51f7882701
|
@ -97,7 +97,23 @@
|
||||||
- [Check Tree Traversal](trees/check-tree-traversal.java)
|
- [Check Tree Traversal](trees/check-tree-traversal.java)
|
||||||
|
|
||||||
## Backtracking
|
## Backtracking
|
||||||
|
|
||||||
- [N Queen Problem](backtracking/nqueen.java)
|
- [N Queen Problem](backtracking/nqueen.java)
|
||||||
|
|
||||||
## Bit Manipulation
|
## Bit Manipulation
|
||||||
|
|
||||||
- [Count Set Bits](bit-manipulation/count-set-bits.java)
|
- [Count Set Bits](bit-manipulation/count-set-bits.java)
|
||||||
|
|
||||||
|
## Recursion
|
||||||
|
|
||||||
|
- [Array sorted or not](recursion/array-sorted.java)
|
||||||
|
- [Sum of all the elements in the array](recursion/array-sum.java)
|
||||||
|
- [Binary search using recursion](recursion/binary-search.java)
|
||||||
|
- [Factorial of a number](recursion/Factorial.java)
|
||||||
|
- [First uppercase letter in a string](recursion/first-uppercase-letter.java)
|
||||||
|
- [Linear search using recursion](recursion/linear-search.java)
|
||||||
|
- [Minimum and maximum element in the array](recursion/min-max-in-array.java)
|
||||||
|
- [Printing 1 to N and N to 1](recursion/print-n.java)
|
||||||
|
- [Print PI value in the string](recursion/print-pi.java)
|
||||||
|
- [Reverse the string](recursion/reverse-string.java)
|
||||||
|
- [Find the length of the string](recursion/string-length.java)
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.dsa;
|
||||||
|
/*Description: To find factorial of a number using recursion
|
||||||
|
|
||||||
|
Time Complexity: O(n) where n is the number given
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Factorial {
|
||||||
|
|
||||||
|
//function starts
|
||||||
|
static int fact(int n) {
|
||||||
|
//base case
|
||||||
|
if (n == 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
int ans = fact(n - 1);
|
||||||
|
//multiply answer with n
|
||||||
|
return ans * n;
|
||||||
|
}
|
||||||
|
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int ans = fact(5);
|
||||||
|
System.out.println("Factorial is: " + ans);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sample Input:
|
||||||
|
n=5
|
||||||
|
|
||||||
|
Output:
|
||||||
|
Factorial is: 120
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Description: To find whether array is sorted or not using recursion
|
||||||
|
|
||||||
|
Time Complexity: O(n) where n is the number of elements present in the array
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ArraySorted {
|
||||||
|
|
||||||
|
// function body
|
||||||
|
static boolean isSorted(int[] arr, int n) {
|
||||||
|
//base case
|
||||||
|
//if the length of the array is 1, it means it is sorted
|
||||||
|
//so return true
|
||||||
|
if (n == 1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//since n means length of the array, check if the element at n-1 index(last) is greater than the element at n-2 index (second last)
|
||||||
|
//if it is greater, then make a recursive function call for checking the remaining elements
|
||||||
|
if (arr[n - 1] > arr[n - 2]) {
|
||||||
|
return isSorted(arr, n - 1);
|
||||||
|
}
|
||||||
|
//if not, return false
|
||||||
|
//this means array is not sorted
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int[] arr = {1, 2, 3, 4, 5};
|
||||||
|
boolean ans = isSorted(arr, arr.length);
|
||||||
|
System.out.println("Array sorted : " + ans);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Sample Input:
|
||||||
|
arr = [1, 2, 3, 4, 5]
|
||||||
|
|
||||||
|
Output: Array sorted : true
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Description: To find the sum of all the elements in the array using recursion
|
||||||
|
|
||||||
|
Time Complexity: O(n)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ArraySum {
|
||||||
|
|
||||||
|
//function starts
|
||||||
|
static int findSum(int[] arr, int n) {
|
||||||
|
//base case
|
||||||
|
//if there is only one element in the array
|
||||||
|
//that element will be the sum
|
||||||
|
if (n == 1) {
|
||||||
|
return arr[0];
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
int ans = findSum(arr, n - 1);
|
||||||
|
//add all the array elements in the answer
|
||||||
|
return ans + arr[n - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int arr[] = {3, 4, 6};
|
||||||
|
int ans = findSum(arr, arr.length);
|
||||||
|
System.out.println("Sum is: " + ans);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Sample Input:
|
||||||
|
arr=[3,4,6]
|
||||||
|
|
||||||
|
Output:
|
||||||
|
Sum is: 13
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Description: Binary Search Program in Java using Recursion
|
||||||
|
|
||||||
|
Time Complexity: O(log N)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class BinarySearch {
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int arr[] = {12, 19, 23, 45, 50, 67, 89};
|
||||||
|
int target = 89;
|
||||||
|
int ans = binarySearchR(arr, target, 0, arr.length - 1);
|
||||||
|
System.out.println("Element found at index: "+ ans);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function
|
||||||
|
static int binarySearchR(int[] arr, int target, int start, int end) {
|
||||||
|
//finding the mid
|
||||||
|
int mid = start + (end - start) / 2;
|
||||||
|
//base case, if element not found, return -1
|
||||||
|
if (start > end) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//return the index if the mid is found
|
||||||
|
if (arr[mid] == target) {
|
||||||
|
return mid;
|
||||||
|
}
|
||||||
|
//recursisve function call
|
||||||
|
if (arr[mid] > target) {
|
||||||
|
return binarySearchR(arr, target, start, mid - 1);
|
||||||
|
} else {
|
||||||
|
return binarySearchR(arr, target, mid + 1, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
/*Description: To find the first uppercase letter in the string using recursion
|
||||||
|
|
||||||
|
TIme Complexity: O(n) where n is the number of characters present in the string
|
||||||
|
*/
|
||||||
|
public class firstUppercaseLetter {
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String s = "hEllo eveRyoNe";
|
||||||
|
char c = printfirstUP(s, 0);
|
||||||
|
System.out.println("First uppercase letter in the string: " + c);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function starts
|
||||||
|
static char printfirstUP(String s, int i) {
|
||||||
|
//base case
|
||||||
|
//if i is equal to the string length, return '\0'
|
||||||
|
//means no uppercase letter found
|
||||||
|
if (i == s.length()) {
|
||||||
|
return '\0';
|
||||||
|
}
|
||||||
|
//if the character at the given index is a capital letter
|
||||||
|
//return it
|
||||||
|
if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') {
|
||||||
|
return s.charAt(i);
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
return printfirstUP(s, i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sample Input:
|
||||||
|
s= hEllo eveRyoNe
|
||||||
|
|
||||||
|
Output:
|
||||||
|
E
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.dsa;
|
||||||
|
/*
|
||||||
|
Description: Linear search in java using recursion
|
||||||
|
|
||||||
|
Time Complexity: O (N)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class LinearSearch {
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int arr[]={7,2,1,98,43,12,55};
|
||||||
|
int target = 2;
|
||||||
|
int ans = linearSearch(arr, target, 0);
|
||||||
|
System.out.println("Element found at index: "+ ans);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function
|
||||||
|
static int linearSearch(int[] arr, int target, int i) {
|
||||||
|
//base case
|
||||||
|
if(i==arr.length){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//if the target element is found, return its index
|
||||||
|
if(arr[i]==target){
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
//make a recursive function call by incrementing variable i by 1
|
||||||
|
return linearSearch(arr, target, i+1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.dsa;
|
||||||
|
/*
|
||||||
|
Description: Java Program to find minimum and maximum value from the array using recursion
|
||||||
|
|
||||||
|
Time Complexity: O(n) where n is the number of elements inside the array
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
|
||||||
|
//function to find maximum element in the array
|
||||||
|
static int findMax(int[] arr, int n) {
|
||||||
|
//base case
|
||||||
|
//if there is only 1 element in array, it will be the maximum element
|
||||||
|
if (n == 1) {
|
||||||
|
return arr[0];
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
int mx = findMax(arr, n - 1);
|
||||||
|
//return maximum element from every recursive call to the function
|
||||||
|
return Math.max(arr[n - 1], mx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//function to find minimum element in the array
|
||||||
|
static int findMin(int[] arr, int n) {
|
||||||
|
//base case
|
||||||
|
//if there is only 1 element in array, it will be the minimum element
|
||||||
|
if (n == 1) {
|
||||||
|
return arr[0];
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
int mn = findMin(arr, n - 1);
|
||||||
|
//return minimum element from every recursive call to the function
|
||||||
|
return Math.min(arr[n - 1], mn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int[] arr = {-1, -2, 3, 4, 5, 6};
|
||||||
|
int min = findMin(arr, arr.length);
|
||||||
|
System.out.println("Minimum element in array: " + min);
|
||||||
|
int max = findMax(arr, arr.length);
|
||||||
|
System.out.println("Maximum element in array: " + max);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sample Input:
|
||||||
|
arr=[-1,-2,3,4,5,6]
|
||||||
|
Output:
|
||||||
|
Minimum element in array: -2
|
||||||
|
Maximum element in array: 6
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.dsa;
|
||||||
|
/*
|
||||||
|
Description: To print from 1 to N and N to 1 using recursion
|
||||||
|
|
||||||
|
Time Complexity: O(n)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class PrintN {
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Printing 1 to N:");
|
||||||
|
print2(5);
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("Printing N to 1");
|
||||||
|
print1(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
//for Printing 1 to N
|
||||||
|
static void print2(int n) {
|
||||||
|
//base case
|
||||||
|
if (n == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
print2(n - 1);
|
||||||
|
|
||||||
|
//print the value of n at each recursive function call
|
||||||
|
System.out.print(n + " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
//for Printing N to 1
|
||||||
|
static void print1(int n) {
|
||||||
|
//base case
|
||||||
|
if (n == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//print the value of n first
|
||||||
|
System.out.print(n + " ");
|
||||||
|
|
||||||
|
//then make the recursive function call
|
||||||
|
print1(n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Output:
|
||||||
|
|
||||||
|
Printing 1 to N:
|
||||||
|
1 2 3 4 5
|
||||||
|
Printing N to 1
|
||||||
|
5 4 3 2 1
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
public class printPi {
|
||||||
|
//main starts
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String s = "piabcpidefpi";
|
||||||
|
changetoPi(s, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//function starts
|
||||||
|
private static void changetoPi(String s, int i) {
|
||||||
|
//base case
|
||||||
|
if (i == s.length()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//if we found "pi" in the string, print 3.14 instead of it
|
||||||
|
//increment i by 2 in recursive function call
|
||||||
|
if (s.charAt(i) == 'p' && s.charAt(i + 1) == 'i') {
|
||||||
|
System.out.print("3.14");
|
||||||
|
changetoPi(s, i + 2);
|
||||||
|
}
|
||||||
|
//else print the character itself and increment i by 1 in recursive function call
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.out.print(s.charAt(i));
|
||||||
|
changetoPi(s, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Sample Input:
|
||||||
|
s = piabcpidefpi
|
||||||
|
|
||||||
|
Output:
|
||||||
|
3.14abc3.14def3.14
|
||||||
|
*/
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
public class ReverseString {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
StringBuilder s = new StringBuilder("latte");
|
||||||
|
String ans = reverse(s, 0, s.length() - 1);
|
||||||
|
System.out.println(ans);
|
||||||
|
//another way
|
||||||
|
String s1 = "hiii";
|
||||||
|
char arr[] = s1.toCharArray();
|
||||||
|
char ans2[] = reverse2(arr, 0, arr.length - 1);
|
||||||
|
String a = String.valueOf(ans2);
|
||||||
|
System.out.println(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char[] reverse2(char[] arr, int start, int end) {
|
||||||
|
if (start > end) {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
char temp = arr[start];
|
||||||
|
arr[start] = arr[end];
|
||||||
|
arr[end] = temp;
|
||||||
|
|
||||||
|
return reverse2(arr, start + 1, end - 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static String reverse(StringBuilder s, int start, int end) {
|
||||||
|
if (start > end) {
|
||||||
|
return s.toString();
|
||||||
|
}
|
||||||
|
char temp = s.charAt(end);
|
||||||
|
s.setCharAt(end, s.charAt(start));
|
||||||
|
s.setCharAt(start, temp);
|
||||||
|
return reverse(s, start + 1, end - 1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.dsa;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Description: To find the length of the string using recursion
|
||||||
|
|
||||||
|
Time Complexity: O(n) where n is the number of characters present in the string
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class StringLength {
|
||||||
|
|
||||||
|
//function body
|
||||||
|
static int findLength(String s) {
|
||||||
|
//if we are at the end of the string return 0
|
||||||
|
//this is the base case
|
||||||
|
if (s.equals("")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//recursive function call
|
||||||
|
//at every recursive function call, we are removing the last character of the string using substring() method
|
||||||
|
//since we are removing one character at every recursive function call we are adding one to it, to count the character
|
||||||
|
return findLength(s.substring(1)) + 1;
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String s = "Hello";
|
||||||
|
//calling the function to return the string length
|
||||||
|
int len = findLength(s);
|
||||||
|
System.out.println(len);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue