1. 程式人生 > >快速解析 遞迴與分治思想

快速解析 遞迴與分治思想

分治思想:     斐波那契數列的迭代實現:(兔子繁殖問題)
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int i;
  5.     int a[40];
  6.     a[0]=0;
  7.     a[1]=1;
  8.     for(i =2; i <40; i++)
  9.     {
  10.         a[i]= a[i -1]+ a[i -2];
  11.         printf("%d", a[i]);
  12.     }
  13.     return0;
  14. }
斐波那契數列的遞迴實現:(兔子繁殖問題)  
  1. intFib(int i)
  2. {
  3.     if(i <2)
  4.         return i ==0?0:1
    ;
  5.     returnFib(i -1)+Fib(i -2);
  6. }
對比以上兩個程式碼發現
  1. 迭代和遞迴的區別是:迭代使用的是迴圈結構,遞迴使用的是選擇結構
  2. 使用遞迴使程式的結構更清晰,更簡潔,更容易讓人理解,從而減少讀懂程式碼的時間
  3. 大量的遞迴呼叫會減少函式的副本,會消耗大量的時間和記憶體,而迭代則不需要此種付出
  4. 遞迴函式分為呼叫和回退階段,遞迴的回退順序是它呼叫順序的逆序
    折半查詢演算法的遞迴實現:         折半查詢法是一種常用的查詢方法,該方法通過不斷縮小一半查詢的範圍,知道達到目的。     漢諾塔問題實現:
  1. //將 n 個盤子從 x 藉助 y 移動到 z
  2. void
    move(int n,char x,char y,char z)
  3. {
  4.     if(1== n)
  5.     {
  6.         printf("%c --> %c\n", x, z);
  7.     }
  8.     else
  9.     {
  10.         move(n -1, x, z, y);//將 n - 1 個盤子從 x 藉助 z 移動到 y 上
  11.         printf("%c --> %c\n", x, z);//將第 n 個盤子從 x 移動到 z 上
  12.         move(n -1, y, x, z);//將 n - 1 個盤子從 y 藉助 x 移動到 z 上
  13.     }
  14. }
  15. int main()
  16. {
  17.     int
    n;
  18.     printf("請輸入層數: ");
  19.     scanf("%d",&n);
  20.     move(n,'X','Y','Z');
  21.     return0;
  22. }
     八皇后問題:         在 8 X 8 格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行,同一列或同一斜線上,共用多少種擺法?
  1. #include<stdio.h>
  2. int count =0;
  3. int notdanger(int row,int j,int(*chess)[8])
  4. {
  5.     int i, flag1, flag2, flag3, flag4, flag5;
  6.     //判斷列方向
  7.     for(i =0; i <8; i++)
  8.     {
  9.         if(*(*(chess + i)+ j)!=0)
  10.         {
  11.         flag1 =1;
  12.     break;
  13.         }
  14.     }
  15.     //判斷左上方
  16.     for(i = row, k = j; i <8&& k <8; i++, k++)
  17.     {
  18.         if(*(*(chess + i)+ k)!=0)
  19.         {
  20.             flag2 =1;
  21.             break;
  22.         }
  23.     }
  24.     //判斷右下方
  25.     for( i = row, k = j; i <8&& k <8; i ++, k ++)
  26.     {
  27.         if(*(*(chess + i)+ k )!=0)
  28.         {
  29.             flag3 =1;
  30.             break;
  31.         }
  32.     }
  33.     //判斷右上方
  34.     for( i = row, k = j; i >=0&& k <8; i--, k++)
  35.     {
  36.         if(*(*(chess + i)+ k)!=0)
  37.         {
  38.             flag4 =1;
  39.             break;
  40.         }
  41.     }
  42.     //判斷左下方
  43.     for( i = row, k = j; i <8&& k >=0; i++, k--)
  44.     {
  45.         if(*(*(chess + i)+ k)!=0)
  46.         {
  47.             flag5 =1;
  48.             break;
  49.         }
  50.     }
  51.     if( flag1 || flag2 || flag3 || flag4 || flag5)
  52.     {
  53.         return0;
  54.     }
  55.     else
  56.     {
  57.         return1;
  58.     }
  59. }
  60. //引數row :表示起始行
  61. //引數n :表示列數
  62. //引數(*chess)[8] : 表示指向棋盤每一行的指標
  63. voidEightQueen(int row,int n,int(*chess)[8])
  64. {
  65.     int chess2[8][8], i, j;
  66.     for(i =0; i <8; i++)
  67.     {
  68.         for(j =0; j <8; j++)
  69.         {
  70.         chess2[i][j]= chess[i][j];
  71.         }
  72.     }
  73.     if(8== row)
  74.     {
  75.         printf("第 %d 種" count +1);
  76.         for(i =0; i <8; i++)
  77.         {
  78.             for(j =0; j <8; j++)
  79.             {
  80. 相關推薦

    快速解析 分治思想

    分治思想:     斐波那契數列的迭代實現:(兔子繁殖問題) #include<stdio.h>int main(){    int i;    int a[40];    a[0

    分治--快速排序

    #include<cstdio> #include<algorithm> using namespace std; int Partition(int a[], int s, int t) //劃分演算法 { int i = s, j = t; int tmp = a[

    Java語言描述:分治策略之合併排序快速排序

    合併排序: package DivideAndConquer; public class MergeSort { //一定要多傳入一個多餘的temp陣列用於存放排序的中間結果 public static<AnyType extends Comparable&l

    演算法分析 分治

    1.  Fibonacci數列    無窮數列1,1,2,3,5,8,13,21,34,55,……,稱為Fibonacci數列。它可以遞迴地定義為: 第n個Fibonacci數可遞迴地計算如下: int fibonacci(int n)  

    演算法導論 第二章 分治

    階乘函式  斐波那契數列 #include <iostream> #include <cstring> #include <algorithm> using namespace std; // 階乘函式 int fact(in

    演算法設計分析(一)——分治

    目錄  D、走迷宮 提示: 提示:  NOJ 2018.9.21 A、二分查詢 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 給定一個單調遞增的整數序列,問某個整數是否在序列中。 輸入

    python快速排序

    寫在前面 眾所周知,快速排序相對於選擇排序,插入排序,氣泡排序等初級排序有著天然的優勢。這是因為快排在交換元素的過程中,兩個發生交換的元素,距離較遠。比如插入排序,新的元素要在已經有序的序列中,一次又一次地找到它應該處於的位置,交換的次數遠遠高於快排。但是,使

    分治策略——找峰頂問題

    問題 給定含有n個不同元素的陣列L=<x1,x2,…,xn>,如果L中存在xi,使得x1<x2<…<xi-1xi+1>…>xn ,則稱L是單峰序列,並稱xi是L的峰頂。假設L是單峰的,設計一個演算法找到L的峰頂,並從理論上分析演算法的

    計算機演算法設計分析之分治策略——二分搜尋技術

    遞迴與分治策略 二分搜尋技術   我們所熟知的二分搜尋演算法是運用分治策略的典型例子,針對這個演算法,先給出一個簡單的案例。   目的:給定已排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定的元素x。   我們首先想到的最簡單的是用順序搜尋方法,逐個比較a[0:n-1]中元素,直至找出元

    第2章 分治策略,二分搜尋技術(查詢不成功時,返回區間位置)

    當要查詢的數x不在有序陣列a中時,返回第一個大於x的數的位置或第一個小於x的數的位置 lowend,midend,highend表示查詢結束時各遊標的值,low,mid,high表示使查詢結束的最後一次操作時,各遊標的值。 查詢結束的條件是lowend>highe

    演算法設計分析筆記之(2):分治策略

    宣告 1)本文僅供學術交流,非商用。具體引用的資料請看參考文獻。如果某部分不小心侵犯了大家的利益,請聯絡博主刪除。 2)本人才疏學淺,整理總結的時候難免出錯,還望各位前輩不吝指正,謝謝。 聯

    萬惡的期末考試---演算法複習---分治策略(二分搜尋大數乘法矩陣對角線相加,strassen矩陣乘法,棋盤覆蓋)

    已經考過三科了,還有三科,明天下午就要考演算法了,心慌慌,抓緊寫個部落格做演算法複習,靜靜心 呃呃呃  說好的只是複習下,自己拓展到了天外 ,第二章還沒結束....程式碼如下 大數乘法過程如下: 二分搜尋與大數乘法與矩陣對角線相加 package chap2_dgfz

    演算法設計分析之分治策略

     分治法:     將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。 (1)可行性:如果原問題可分割成k個子問題(1<k<=n),且這些子問題都可解,並可利用這些子問題的解求出原問題的解,那麼分治法就是可行的。 (2)分治法與

    演算法期末複習-----分治

    第二章遞迴與分治 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。   1.全排列 演算法思想:當n=1時,Perm(R)=(r),當n>1時,perm (R)=(r1)perm(R1),Ri=R-{ri),而perm(R

    詳細解說分治演算法,一文帶你入門到熟悉

    全文共 2114 字,閱讀文字大概需要 3.8 分鐘。 前言 這幾天看到交流有人群裡說有關遞迴的棧溢問題,剛好小編又看到有關遞迴的東西,給大家闡述一下遞迴和分治的內容,讓各位更加理解有關前賢的各種化整為零。 正文 很多人認為遞迴是語言中最為難以理解的內容之一,其

    計算機演算法設計分析——分治策略(一)

    遞迴: 直接或者間接地呼叫自身的演算法稱為遞迴。用函式自身給出定義的函式成為遞迴函式。 使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。有些資料結構,如二叉樹等,由於其本身固有的遞迴特性,特別適合用遞迴的形式來描述。另外,還有一些問題,雖然其本身沒

    快速排序演算法

    快速排序是不穩定的,是對氣泡排序的改進。它的改進之處在於每輪會使一個基數歸位,同時可以使基數兩邊的兩組數基本有序(基數左邊的數都小於基數,基數右邊的數都大於基數)它的平均時間複雜度O(nlogn),最壞時間複雜度就是退化成氣泡排序O(n^2)思路無論是遞迴還是非遞迴,都需要給

    第二章 分治策略(排列的字典序問題)

    一. 遞迴 1.概念 直接或間接地呼叫自身的演算法。用函式自身給出定義的函式稱為遞迴函式。 2.說明 (1)每個遞迴函式都必須有非遞迴定義的初始值,否則,遞迴函式就無法計算。 (2)遞迴式的主

    分治策略-2.11迴圈賽日程表

    設有n=2^k個運動員要進行網球迴圈賽,現要設計一個滿足以下要求的比賽日程表: (1)每個選手必須與其他n-1個選手各賽一次; (2)每個選手一天只能賽一次; (3)迴圈賽一共進行n-1天。 按

    1. 分治

    遞迴 在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。 n-皇后  &nb