2.遞歸--基本概念及思路

遞歸設計經驗:

1.找重複:找到規模更小的子問題(本次做一部分剩下的分給下一次調用函數去做)

2.找重複中的變化量-->參數

3.找參數的變化趨勢-->設計出口

思路:

1.(切蛋糕)將一個大問題分解爲子問題(一個小問題或多個子問題)

2.遞推公式(逐步變小)

例如:n的階乘,斐波那契數列等

1.思路一:小練習:字符串的反轉(從後向前遞歸)

 
  static String reverse(String src,int end)//字符串的反轉
  {    if(end==0) return ""+src.charAt(0);
	  return src.charAt(end)+reverse(src,end-1);//charAt() 方法用於返回指定索引處的字符。索引範圍爲從 0 到 length() - 1
  }
  

2.思路二:最大公約數(輾轉相除)

 
  static int  f5(int a,int b)
  {
	  if(a%b==0)return b;
	  int k=a%b;
	  a=b;b=k; 
	 return  f5(a,b);
  }
  //f5簡化爲f6
  static int f6(int a,int b)
  {
	  if(a%b==0)return b;
	  return f6(b,a%b);
  }
  
  

3.(思路一)插入排序的遞歸函數


  static void insertsort(int arr[],int k)//數組位置K(0-k)
  {   
	  if(k==0)   return;
	  insertsort(arr,k-1);
	  int x=arr[k];
	  int index=k-1;
	  while (index>-1&&x<arr[index])//注意判斷index;
	  {
		  arr[index+1]=arr[index];
		  index--;
	  }
	  
	 arr[index+1]=x;//注意index多減了一個
  }
  

遞歸經典問題:漢諾塔遊戲

1-N從A移動到B,劃分爲以下子問題:

       1.1-N-1移動到C(B做輔助)

       2.N移動到B

       3.1-N從C移動到B(A做輔助)

static void tower(int n,String from,String to,String help)
  {
	  if(n==1) {//當僅剩一個盤時,直接移到目標盤
		  System.out.println("move"+n+"from"+from+"to"+to); 
	  }
	  else {
		   tower(n-1,from,help,to);//把前n-1個盤子挪到輔助空間上去
		   System.out.println("move"+n+"from"+from+"to"+to); 
		   tower(n-1,help,to,from);//把n-1個盤子從輔助空間移到目標盤
		  }
	  
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章