一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言 function recursion函數遞歸詳解

C語言 function recursion函數遞歸詳解

2022-02-12 17:09Dark And Grey C/C++

遞歸指的是在函數的定義中使用函數自身的方法,舉個例子: 從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么呢?"從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是什么

function recursion(函數遞歸)

函數遞歸: 是在 一個 過程 或 函數 在其定義或說明中有 直接 或 間接 調用自身 的一種方法

通常把一個 大型復雜的問題 層層 傳化 為一個與 原理相似的 ,規模較小 的問題

遞歸策略 只需 少量的程序 就可以描述出 解題過程 所需的 多次 重復 計算,大大減少了程序的代碼量

遞歸的中心思想為:

大事化小。

程序一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
    printf("hehe");
    main();//陷入死循環,但因為棧溢出,最后會停下來 == stack overflow - 棧溢出
 
 任何一次函數調用,它都會向內存申請空間,分為三部分 棧區,堆區,靜態區
 
 棧區 :局部變量,函數的形參
 
堆區: 動態開辟的內存 - malloc(分配內存) and calloc(動態內存分配并初始化零)
 
 靜態區: 全局變量,static修飾的變量
    return 0;
}

遞歸的兩個必要條件

1,存在限制條件,當滿足這個限制條件的時候,遞歸將不再繼續
2.每次遞歸調用之后越來越接近這個條件

程序一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
一共調用三次
1                                                    2                                    3
void print(int n)// n == 123                       void print(int n)n == 12         void print(int n)  m == 1
{                                           //    {                                 {                                            
    if (n > 9)                             //         if (n > 9)                        if (n > 9)        
    {                                       //        {                                {                                      
        print(n / 10);// 這里再調用 print 函數            print(n / 10);                  print(n / 10);           
    }                                      //         }                                }
    printf("%d ",n%10);   // 最后打印3  //           printf("%d ",n%10); 再打印個2      printf("%d ",n%10); 首先打印 1
}                                          //     }                                 }  
int main()
{
    unsigned int num = 0;
    scanf("%d",&num);//123
    //遞歸
    print(num);//1 2 3
    return 0;
}

程序二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
#include<string.h>
 
寫法1(計數器)
int my_strlen(char* str)//str指針變量,需要返回整形
{
    int count = 0;  
    while (*str != '\0')
    {
        count++;
        str ++;
    }
    return count;
}
寫法2(遞歸)
int my_strlen(char* str)//str指針變量,需要返回整形
{
    if (*str != '\0')
    {
        return 1 + my_strlen(str + 1);
    }
    else
        return 0;
}
int main()
{
    char arr[] = "bit";
    //int len = strlen(arr);
    //printf("%d\n", len);
 
    //模擬實現一個strlen函數
    int len = my_strlen(arr);
    printf("len = %d\n",len);
    return 0;
}

練習

求n的階乘

迭代與遞歸

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
1 迭代方式
 int facl(int n)
{
    int i = 0;
    int ret = 1;
    for (i = 1; i <= n; i++)
    {
        ret = ret*i;
    }
    return ret;
}
 
遞歸方式
int facl(int n)
{
    if (n <= 1)
    {
        return 1;
    }
    else
        return n*facl(n - 1);
        這里說明一下思維
        假設 我們 要求 10 的階乘 1x1x2x3x4x5x6x7x8x9x10
        我們的 n 一開始是 10, 10*facl(n-1) ,其實 facl 函數 就是 把 10 減一,遞歸就好像是循環,循環的目的,就是 得到 10每次減一的結果,直到它等于1,再讓其鏈接起來,
        你可以這么看
        10 *(9 * (8 * (7 * ((6 * (5 * (4 *(3 * (2 * (1 * (1))))))))))
        等價于
        10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 * 1
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = facl(n);//循環方式
    printf("%d\n",ret);
    return 0;
}

再來道例題

斐波那契函數 1 1 2 3 5 8 13 21
從 第三個數 開始,該數等前面兩個數的和。
求第第n個斐波那契函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h>
這題用遞歸效率很低,很多數會重復計算
int fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return fib(n - 1)+fib(n - 2);// 因為 函數 每得到一個數,就需要將得到的數進行分解成 2個 部分
}
 
2迭代(循環)方式(簡單加法)
效率更高
int fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while (n>2)//
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
 
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = fib(n);
    printf("%d\n",ret);
    return 0;
}

C語言 function recursion函數遞歸詳解

到此這篇關于C語言 function recursion函數遞歸詳解的文章就介紹到這了,更多相關C語言 函數遞歸內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/DarkAndGrey/article/details/120605939

延伸 · 閱讀

精彩推薦
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 国产大片免费在线观看 | 亚洲一卡2卡4卡5卡6卡残暴在线 | 天天快乐高清在线观看 | 美女国内精品自产拍在线播放 | 污污在线免费观看 | 欧美一级片观看 | 日韩精品视频美在线精品视频 | 激情综合| 吃瓜视频在线观看 | 明星裸乳照无奶罩 | 国产3p绿奴在线视频 | 成年人视频在线免费看 | 好大好硬好紧太深了受不了 | 青青青手机视频 | china国产bbw| 欧美乱子伦xxxx12在线 | 亚洲伦理天堂 | 视频一区二区三区在线 | 国产日韩一区二区三区 | 99热在这里只有精品 | 91传媒在线观看 | 国产haodiaose最新 | 成人高辣h视频一区二区在线观看 | 亚洲第一区欧美日韩精品 | 久久国产精品无码视欧美 | 色婷婷婷丁香亚洲综合不卡 | 五月天婷婷精品免费视频 | 国产成人综合网亚洲欧美在线 | 免费一级毛片在线播放 | 亚欧综合| 精品一区二区三区在线视频观看 | 亚洲福利精品电影在线观看 | 公妇仑乱在线观看 | 三级视频中文字幕 | 欧美视频精品一区二区三区 | 欧美牛逼aa | 精品第一国产综合精品蜜芽 | 国产成人综合亚洲亚洲欧美 | 亚洲精品丝袜在线一区波多野结衣 | 2019国产精品 | 美女靠逼免费网站 |