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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C/C++ - C語(yǔ)言 function recursion函數(shù)遞歸詳解

C語(yǔ)言 function recursion函數(shù)遞歸詳解

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

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

function recursion(函數(shù)遞歸)

函數(shù)遞歸: 是在 一個(gè) 過(guò)程 或 函數(shù) 在其定義或說(shuō)明中有 直接 或 間接 調(diào)用自身 的一種方法

通常把一個(gè) 大型復(fù)雜的問(wèn)題 層層 傳化 為一個(gè)與 原理相似的 ,規(guī)模較小 的問(wèn)題

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

遞歸的中心思想為:

大事化小。

程序一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
    printf("hehe");
    main();//陷入死循環(huán),但因?yàn)闂R绯觯詈髸?huì)停下來(lái) == stack overflow - 棧溢出
 
 任何一次函數(shù)調(diào)用,它都會(huì)向內(nèi)存申請(qǐng)空間,分為三部分 棧區(qū),堆區(qū),靜態(tài)區(qū)
 
 棧區(qū) :局部變量,函數(shù)的形參
 
堆區(qū): 動(dòng)態(tài)開(kāi)辟的內(nèi)存 - malloc(分配內(nèi)存) and calloc(動(dòng)態(tài)內(nèi)存分配并初始化零)
 
 靜態(tài)區(qū): 全局變量,static修飾的變量
    return 0;
}

遞歸的兩個(gè)必要條件

1,存在限制條件,當(dāng)滿足這個(gè)限制條件的時(shí)候,遞歸將不再繼續(xù)
2.每次遞歸調(diào)用之后越來(lái)越接近這個(gè)條件

程序一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
一共調(diào)用三次
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);// 這里再調(diào)用 print 函數(shù)            print(n / 10);                  print(n / 10);           
    }                                      //         }                                }
    printf("%d ",n%10);   // 最后打印3  //           printf("%d ",n%10); 再打印個(gè)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>
 
寫(xiě)法1(計(jì)數(shù)器)
int my_strlen(char* str)//str指針變量,需要返回整形
{
    int count = 0;  
    while (*str != '\0')
    {
        count++;
        str ++;
    }
    return count;
}
寫(xiě)法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);
 
    //模擬實(shí)現(xiàn)一個(gè)strlen函數(shù)
    int len = my_strlen(arr);
    printf("len = %d\n",len);
    return 0;
}

練習(xí)

求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);
        這里說(shuō)明一下思維
        假設(shè) 我們 要求 10 的階乘 1x1x2x3x4x5x6x7x8x9x10
        我們的 n 一開(kāi)始是 10, 10*facl(n-1) ,其實(shí) facl 函數(shù) 就是 把 10 減一,遞歸就好像是循環(huán),循環(huán)的目的,就是 得到 10每次減一的結(jié)果,直到它等于1,再讓其鏈接起來(lái),
        你可以這么看
        10 *(9 * (8 * (7 * ((6 * (5 * (4 *(3 * (2 * (1 * (1))))))))))
        等價(jià)于
        10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 * 1
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int ret = facl(n);//循環(huán)方式
    printf("%d\n",ret);
    return 0;
}

再來(lái)道例題

斐波那契函數(shù) 1 1 2 3 5 8 13 21
從 第三個(gè)數(shù) 開(kāi)始,該數(shù)等前面兩個(gè)數(shù)的和。
求第第n個(gè)斐波那契函數(shù)

?
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>
這題用遞歸效率很低,很多數(shù)會(huì)重復(fù)計(jì)算
int fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return fib(n - 1)+fib(n - 2);// 因?yàn)?函數(shù) 每得到一個(gè)數(shù),就需要將得到的數(shù)進(jìn)行分解成 2個(gè) 部分
}
 
2迭代(循環(huán))方式(簡(jiǎn)單加法)
效率更高
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語(yǔ)言 function recursion函數(shù)遞歸詳解

到此這篇關(guān)于C語(yǔ)言 function recursion函數(shù)遞歸詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 函數(shù)遞歸內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 丝袜兔女郎被啪在线观看91 | 射玉足 | 精品视频手机在线观看免费 | 无人在线视频高清免费观看动漫 | 国产成人v爽在线免播放观看 | 12345国产精品高清在线 | 欧美在线一级视频 | 亚洲精品福利一区二区在线观看 | 免费观看俄罗斯特黄特色 | 波多野结衣作品在线观看 | bt天堂在线最新版在线 | 国产在线视频自拍 | 亚洲国产高清一区二区三区 | 免费视频精品一区二区三区 | 国产黄频在线观看高清免费 | 国产精品午夜性视频网站 | 国产老熟| 78成人网| 亚洲国产精品无圣光一区二区 | 香蕉久久一区二区不卡无毒影院 | 女王厕便器vk | 爱福利一区二区 | 色人阁导航 | 五月最新女厕所高跟嘘嘘 | 经典欧美gifxxoo动态图暗网 | 亚洲品质自拍视频网站 | 91中文字幕yellow字幕网 | 好湿好紧太硬了我好爽 | 日本在线视频网 | 欧美高清milf在线播放 | 亚洲国产精品91 | 日本精品久久久久中文字幕 1 | 小小水蜜桃视频高清在线播放 | 四虎1515h永久 | 啊啊啊好大视频 | 人人澡 人人澡碰人人看软件 | 国产真实伦对白在线播放 | 日本久久啪啪婷婷激情五月 | 亚洲麻豆精品 | 农村妇女野战bbxxx | 欧美精品一国产成人性影视 |