C語言之通俗易懂的遞歸算法

圖片描述

摘要

記得大學接觸的第一門課程就是C語言,裏面讓我印象深入之一就是遞歸,受大學老師講遞歸的啓發
我嘗試着用最通俗、最易懂的方式講解遞歸。遞歸其實真的不難。以爲遞歸很難的朋友,能夠試試看一下,相信若是你能認真的看完這篇文章,或許會有很大的收穫git

遞歸產生條件

遞歸兩個必要條件:github

**1.遞歸函數** 
**2.遞歸出口**

下面的練習會讓你清晰的發現,遞歸其實就是要找 遞歸函數和遞歸出口 這兩步數組

練習函數

假設有個數列 1 3 5 7 9 11 .... 找到第n項的值

邏輯分析:測試

圖片描述

遞歸函數:f(n) = f(n-1)+2;
遞歸出口:f(1) = 1;spa

代碼實現code

/**
     假設有個數列 1 3 5 7 9 11 ....
    
     遞歸函數:f(n) = f(n-1)+2;
     遞歸出口: f(1) = 1;
     
     @param n 求n項的值
     @return 返回第n項的值
     */
    int find(int n) {
        if (n == 1) {// 遞歸出口
            return 1;
        } else {//遞歸函數
            return find(n-1)+2;
        }
    }

Fibonacci 斐波那契數列

邏輯分析:
圖片描述遞歸

遞歸函數:fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)
遞歸出口:fibonacci(1) = 1,fibonacci(2) = 1;圖片

代碼實現ci

/**
     fibonacci 斐波那契數列
     1 1 2 3 5 8 13 21 ....
     
    遞歸函數:fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)
    遞歸出口:fibonacci(1) = 1,fibonacci(2) = 1;
     
     @param n 求第n項
     @return 返回第n項的值
     */
    int fibonacci (int n) {
        if (n==1 || n==2) { // 遞歸出口
            return 1;
        } else { //遞歸函數
            return fibonacci(n-1)+fibonacci(n-2);
        }
        return 0;
    }

有序數列求和:1+2+3+4+...+100

邏輯分析:
圖片描述

遞歸函數:sum(n) = sum(n-1)+n
遞歸出口:f(1) = 1

代碼實現

/**
     //有序數列
     求和:1+2+3+4+...+100
     
     遞歸函數:sum(n) = sum(n-1)+n
     遞歸出口:f(1) = 1
    
     @param n 前n項
     @return 返回 前n項的和
     */
    int sum(int n) {
        if (n == 1) {
            return 1;
        } else {
            return sum(n-1)+n;
        }
    }

無序數列求前n項的和:{1, 7, 8, 6, 8, 9, 0, 10}

邏輯分析:
圖片描述

遞歸函數:sum1(arr,n) = sum1(arr,n-1)+arr[n];
遞歸出口:sum1(arr,0) = arr[0]

代碼實現

/**
     //無序數列
     求前n項的和:int arr[] = {1, 7, 8, 6, 8, 9, 0, 10}
    
     遞歸函數:sum1(arr,n) = sum1(arr,n-1)+arr[n];
     遞歸出口:sum1(arr,0) = arr[0]
     
     @param arr 數組
     @param n 求數組中第幾項
     @return 返回中前n項的和
     */
    int sum1(int arr[], int n) {
        if (n == 0) {
            return arr[0];
        } else {
            return sum1(arr,n-1)+arr[n];
        }
    }

無序數列求數組中前n項的最大值

邏輯分析:
圖片描述
圖片描述

遞歸函數:

if (findMaxNum(arr, n-1) > arr[n]) {
           return findMaxNum(arr, n-1);
        } else {
           return arr[n];
       };

遞歸出口: n == 0 return arr[0];
代碼實現

/**
     //無序數列
     求數組中前n項的最大值:int arr1[] = {7, 4, 8, 6, 8, 9, 11, 5}
     
     遞歸函數:      if (findMaxNum(arr, n-1) > arr[n]) {
                        return findMaxNum(arr, n-1);
                   } else {
                        return arr[n];
                   };
     遞歸出口:n == 0 return arr[0];
    
     @param arr 數組
     @param n 求數組中前n項的最大值
     @return 返回數組中前n項的最大值
     */
    int findMaxNum(int arr[], int n) {
        if (n == 0) {
            return arr[0];
        } else if (findMaxNum(arr, n-1) > arr[n]) {
            return findMaxNum(arr, n-1);
        } else {
            return arr[n];
        }
    }

測試功能

int num ;
       
        num = find(6);
        printf("第6項的值爲%d\n",num);
        
        num = fibonacci(6);
        printf("第6項的值爲%d\n",num);
        
        num = sum(100);
        printf("前100項的和爲%d\n",num);
        
        int arr[] = {1, 7, 8, 6, 8, 9, 0, 10};
        num = sum1(arr,7);
        printf("前7項的和爲%d\n",num);
        
        int arr1[] = {7, 4, 8, 6, 8, 9, 11, 5};
        num = findMaxNum(arr1, 7);
        printf("前7項的最大值爲%d\n",num);

輸出結果

圖片描述

不積跬步,無以致千里
當咱們踏上一條路,便不要再問路有多遙遠,處境是否坎坷。咱們不斷的走走停停,繁華的是風景,荒蕪的是歲月。

源碼地址:

Recursion

相關文章
相關標籤/搜索