Java 使用遞歸函數的實例


//用遞歸調用的方法求n!
public static int fo(int n){

if(n<2){ return 1;
}else{
return n*fo(n-1);
}
}

//用遞歸法求和1+2+3+4......+n
public static int add(int m){
if(m==1){
return 1;
}else{
return m+add(m-1);
}
}


    /*
     * 一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 用遞歸算法實現。
     * */
    static int find30(int n){
        if (n <= 0)
            return 0;
            else if(n > 0 && n <= 2)
            return 1; 
        return find30(n-1)+find30(n-2);
            
    }
    
    
    /*
     * 將一整數逆序後放入一數組中(要求遞歸實現) Ex : 1234 變爲 {4,3,2,1}
     */


    static int revert(int rs[], int i, int number) {
        if (i < rs.length) {
            rs[i] = number % 10;
            number = (number - number % 10) / 10;
            return revert(rs, i + 1, number);
        } else {
            return 0;
        }


    }


    /*
     * 遞歸實現迴文判斷(如:abcdedbca就是迴文,判斷一個面試者對遞歸理解的簡單程序)
     */
    static boolean loopWord(String str, int i) {


        if (str.charAt(i) == str.charAt(str.length() - 1 - i)) {
            if (i == (str.length() + 1) / 2)
                return true;
            return loopWord(str, i + 1);
        } else {
            return false;
        }
    }


    /*
     * 分解成質因數(如435234=251*17*17*3*2,據說是華爲筆試題)
     */


    static int dividePrimeToFactors(int num, int factor) {


        while ((factor < num) && (num % factor != 0))
            factor++;
        System.out.print(factor + " ");
        num = num / factor;
        if (factor >= num)
            return factor;// 結束判斷
        return dividePrimeToFactors(num, factor + 1);


    }


    public static void main(String[] args) {
       
        System.out.println(find30(30));
        
        int number = 1234;
        int[] rs = new int[(number + "").length()];
        revert(rs, 0, number);
        for (int i = 0; i < rs.length; i++) {
            System.out.print(rs[i]);
        }


        System.out.println(loopWord("1234321", 0));


        dividePrimeToFactors(435234, 2);


    }


}
//養牛23457

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		//用一個二維數組存放輸入的m 和k
		int[][] arr= new int[n][2];
		for(int i=0;i<n;i++) {
			int m = sc.nextInt();
			int k = sc.nextInt();
			arr[i][0] = m;
			arr[i][1] = k;
		}
		solution(arr);
	}
	public static void solution(int[][] arr) {
		ArrayList<Integer> list = new ArrayList();
		for(int i=0;i<arr.length;i++) {
			int m = arr[i][0];
			int k = arr[i][1];
			int res = getSum(m, k);
			list.add(res);
			
		}
		for(Integer i:list) {
			System.out.println(i);
		}
	}
	
	public static int getSum(int m,int k) {
		int i=0;
		if(k<5) {
			return m*(k+1);
		}else {
			return getSum(m,k-1)+getSum(m,k-4);
		}
		
	}

// 遞歸方法decimalToBinary,把一個十進制數轉換成二進制數
	public static void decimalToBinary(int num) {
		if (num == 0) { // 當num=0時,循環結束
			return;
		} else {
			decimalToBinary(num / 2); // 調用遞歸方法
			System.out.print(num % 2);
		}
	}

//遞歸方法yueshu,求兩個數的最大公約數 ,用兩個數的絕對值與這兩個數較小的那個一直比較,直到相等爲止。
	public static void yueshu(int num1, int num2) {
		if (num1 == num2) {
			System.out.println(num1); // num1=num2時,結束
		} else {
			yueshu(abs(num1 - num2), min(num1, num2)); // 調用遞歸方法
		}
	}

 // 遞歸方法hanon,求漢諾塔算法
	public static void hanon(int n, char a, char b, char c) {
		if (n == 1) {
			move(1, a, c);// 最後一種情況是,把A柱子上盤子移到C柱子上。
			return;
		}
		hanon(n - 1, a, c, b); // 遞歸,把n-1個盤子從A 盤上藉助C盤移到B盤上
		move(n, a, c);// 調用move()方法
		hanon(n - 1, b, a, c);// 遞歸,把把n-1個盤子從B盤上藉助A盤移到C盤上
	}
	public static void move(int n, char a, char c) {
		System.out.println(n + ":" + a + "-->" + c);// 打印移動盤子情況
	}


/** 
   * 打印出九九乘法表 
   * @param i 
   */
  public static void m(int i) { 
    if (i == 1) { 
      System.out.println("1*1=1 "); 
    } else { 
      m(i - 1); 
      for (int j = 1; j <= i; j++) { 
        System.out.print(j + "*" + i + "=" + j * i + " "); 
      } 
      System.out.println(); 
    } 
  }  


// 利用遞歸實現,將輸入的一個字符串中的所有元素進行排序並輸出
	public static void permute(char[] list, int low, int high) {
		int i;
		if (low == high) {
			String cout = "";
			for (i = 0; i <= high; i++) {
				cout += list[i];
			}
			System.out.println(cout);
		} else {
			for (i = low; i <= high; i++) {
				char temp = list[low];
				list[low] = list[i];
				list[i] = temp;
				permute(list, low + 1, high);
				temp = list[low];
				list[low] = list[i];
				list[i] = temp;
			}
		}
	}


//打印斐波拉契數列前20項
public class FeibolaqiTest {
public int fblq(int n)
{
if(n==1||n==2)
{
return 1;
}else
{
return (fblq(n-1)+fblq(n-2));
}
}
public static void main(String[] args) {
FeibolaqiTest t=new FeibolaqiTest();
//int s=t.fblq(20);
for(int i=1;i<20;i++)
{
int num=t.fblq(i);
System.out.print(num+" ");
}
}

}

發佈了40 篇原創文章 · 獲贊 6 · 訪問量 4799
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章