遞歸調用


1.組合式公式

設計思想

實驗要求輸入兩個數求組合數,首先要輸這兩個數才能進行程序,輸入后,根據組合數公式中全是階乘,使用遞歸比較方便,n!=n*(n-1)*......1,遞歸中返回n*zuheshu(n-1),實現階乘,最后調用階乘函數,輸出就完成程序。

程序流程圖

 

實驗源代碼

import java.util.Scanner;
public class Sz {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	Scanner input=new Scanner(System.in);
	int a;
	int b;
	int c;
	//定義所需的三個變量
	System.out.println("輸入組合數公式所需的數:");
	a=input.nextInt();
	b=input.nextInt();
	//對要計算的兩個變量進行賦值。
	while(a==0||a<=b)
	{
		System.out.println("無法計算,重新輸入");
	
	}
	//判斷底下的除數是否可除
c=zuheshu(a)/(zuheshu(b)*zuheshu(a-b));//用遞歸函數對a,b進行賦值計算后傳給c。
System.out.println("組合數為"+c);//輸出組合數。
	}
	//創建遞歸函數,設置形參,還有int類型,用來返回int型的c。
	public static int zuheshu(int n)
			{
		if(n==1||n==0)
		{
			return 1;
		}
		else 
			return n*zuheshu(n-1);//遞歸,自己引用自己進行計算。
			}

}

  實驗截圖

2.楊輝三角算組合數

設計思想

與前面的思想大致相同,但所需要遞歸調用的數學式子不同。值得注意的是調用函數的返回值要與定義的賦值元素相同,否則無法執行。

程序源代碼

import java.util.Scanner;
public class Sz2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 Scanner input=new Scanner(System.in);
		 int a;
		 int b;
		 System.out.println("輸入楊輝三角的兩個數:");
		 a=input.nextInt();
		 b=input.nextInt();
		 System.out.println(yhsjdg(a+1,b)-yhsjdg(a,b-1));
		    
	}
	 public static long yhsj(int n) {
	        if(n==1 || n==0){
	            return 1;
	        }
	        return n*yhsj(n-1);
	    }
	    
	public static long yhsjdg(int i,int j) {
	    long c= yhsj(i)/yhsj(j)/yhsj(i-j);
	    return c;
	}
    }

  實驗截圖

3.遞推方法算組合數

實驗思想

前兩個都是遞歸求階乘后再次算出組合數,遞推直接求,直接返回 (zuheshu(n-1,k-1)+zuheshu(n-1,k));

程序源代碼

import java.util.Scanner;
public class Sz1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		int a;
		int b;
		int c;
		//定義所需的三個變量
		System.out.println("輸入組合數公式所需的數:");
		a=input.nextInt();
		b=input.nextInt();
		System.out.println("組合數為:"+zuheshu(a,b));
	}
public static int zuheshu(int n,int k)
{
	if(k==0)
	{
		return 1;
	}
	else if(n==k)
	{
		return 1;
	}
	else 
		return (zuheshu(n-1,k-1)+zuheshu(n-1,k));
	}
}

  實驗截圖

實驗中出現的問題

1.對於遞歸調用這種函數要想很久才能繞過彎來。

2.在判斷a,b為0或1時,返回值return應為1,一直返回0導致程序無法執行找不到錯誤。

3.楊輝三角的不熟悉導致第二個沒有思路可以下手。

4.漢諾塔問題

設計思路

先假設最簡單的有3個盤子,要把上面兩個放到中間B的位置,再把最底下的放到C位置,要把兩個放到B上面又要把第一個放到C上,第二個放到B上,再把第一個放到B上,最后就是把B上第一個的放到A,第二個放到C,再把A上的放到C,就完成了。這就是一種遞歸,假設有n個盤子,先把(n-1)放到B坐,把最下面的放到C,(n-1)中又把(n-2)放到B,再拿出最底下的(n-1),一直重復最后放完。

程序流程圖

 

程序源代碼

   import java.util.Scanner;
public class Hannuota {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		int m;
		System.out.println("放入的盤子數:");
		m=input.nextInt();
		System.out.println("移動的步驟:");
		buzhou(m,'A','B','C');
	}
	public static void buzhou(int n,char one,char two,char three)
	{
		
			if(n==1)
				move(one,three);
			else{
				buzhou(n-1,one,three,two);
				move(one,three);
				buzhou(n-1,two,one,three);
			}
		}
		public static void move(char x,char y)
		{
			System.out.println(x+"——>"+y);
		}
	}

  實驗截圖

實驗問題

1.由於要遞歸兩次,所以導致該開始沒有實現。

2.溫馨提示就是c語言書中有操作步驟,可以作為參考。

 5.回文數

實驗思想

回文數就是說正着讀,反着讀都一樣,也就是說如果只有一個字符,一定回文,兩個一樣的,一定回文,三個以上的話,最左邊和最右邊相同然后依次向里夾都相同就回文。“往里夾”就是要用遞歸的基本方式。這是這個程序的核心,整體的思路就是輸入字符串,然后進行調用回文的遞歸函數,判斷后,輸出。

實驗流程圖

程序源代碼

import java.util.Scanner;
public class Hw {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		String s;
		System.out.println("輸入要判斷的字符:");
		s=input.next();
		System.out.println(huiwenshu(s));
	}
 public static boolean huiwenshu(String s)
 {
	  int length = s.length();
	  for(int i=0;i<length/2;i++){
	   if(s.charAt(i)!=s.charAt(length-i-1)){
	    return false;
	   }
	  }
	  return true;
 }
}

  實驗截圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM