C遞歸演算法經典實例

一、遞歸的概念

遞歸是指函數自己調用自己,通常在解決問題時使用。在C語言中,遞歸實現的問題與循環實現的問題一樣,只是解決問題的思路不同。

遞歸函數有兩個重要的特點:

  • 自己調用自己,直到達到某個條件後停止
  • 必須有終止條件,否則會一直遞歸下去,導致棧溢出

二、遞歸實例:斐波那契數列

斐波那契數列是指:第一項和第二項均為1,第三項開始每一項均為前兩項之和,即:1, 1, 2, 3, 5, 8, 13, ……

可使用遞歸函數實現斐波那契數列:


int fibonacci(int n){
    if(n <= 1){
        return n;
    }
    else{
        return fibonacci(n-1) + fibonacci(n-2);
    }
}

上述代碼中,當n為1或0時,直接返回n的值,否則返回前兩項之和。

三、遞歸實例:階乘

階乘是指從1到n所有整數的乘積,由於階乘增長速度快,因此使用遞歸來求解。

使用遞歸函數求解階乘:


int factorial(int n){
    if(n<=1){
        return 1;
    }
    else{
        return n*factorial(n-1);
    }
}

上述代碼中,當n為0或1時,返回1,否則返回n乘以(n-1)的階乘。

四、遞歸實例:漢諾塔

漢諾塔是一種經典問題,題目描述:有三個柱子A,B,C,在A柱子上有n個盤子,盤子大小不一,大的在下面,小的在上面。現在需要將A柱子上的n個盤子全部移動到C柱子上,移動過程中要保證大盤子在下面,小盤子在上面,且每次只能移動一個盤子。

使用遞歸函數實現漢諾塔:


void hanoi(int n, char a, char b, char c){
    if(n == 1){
        printf("Move disk %d from %c to %c\n", n, a, c);
    }
    else{
        hanoi(n-1, a, c, b);
        printf("Move disk %d from %c to %c\n", n, a, c);
        hanoi(n-1, b, a, c);
    }
}

上述代碼中,當n為1時直接將盤子從a移動到c,否則將n-1個盤子從a經過c移動到b,將第n個盤子從a移動到c,最後將n-1個盤子從b經過a移動到c。

五、遞歸實例:快排

快速排序是一種高效的排序演算法,使用遞歸可以簡單實現。

使用遞歸函數實現快速排序:


void quick_sort(int arr[], int left, int right){
    if(left < right){
        int i = left, j = right, pivot = arr[left];
        while(i < j){
            while(i = pivot){
                j--;
            }
            if(i < j){
                arr[i++] = arr[j];
            }
            while(i < j && arr[i] < pivot){
                i++;
            }
            if(i < j){
                arr[j--] = arr[i];
            }
        }
        arr[i] = pivot;
        quick_sort(arr, left, i-1);
        quick_sort(arr, i+1, right);
    }
}

上述代碼中,取最左邊的數為基點,設兩個指針,i從左邊開始,j從右邊開始,交換i和j指向的數,直到i>=j,將基點放到i的位置,再遞歸調用快排函數。

六、總結

遞歸是一種常用的編程技巧,能夠解決許多問題。但是遞歸也存在一些缺點,如遞歸層數過多容易導致棧溢出等問題。在使用遞歸時應該注意終止條件和遞歸深度的控制。

原創文章,作者:CJEGR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333620.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CJEGR的頭像CJEGR
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 台階走法遞歸

    台階走法遞歸是一個經典的遞歸問題,在計算機演算法中有著廣泛的應用。本篇文章將從遞歸的思想出發,詳細分析如何解決這個問題。 一、遞歸基礎知識 遞歸是指一個函數直接或間接地調用自身。遞歸…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29

發表回復

登錄後才能評論