日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux C学习---递归函数

發(fā)布時(shí)間:2023/12/9 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C学习---递归函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近學(xué)習(xí)到了遞歸,剛開(kāi)始看,真是頭大,函數(shù)里面嵌套其本身,到底是怎么個(gè)流程啊?

現(xiàn)在,咱們先了解下遞歸函數(shù)的數(shù)學(xué)原理:

高中的時(shí)候就出現(xiàn)很多遞歸函數(shù),應(yīng)該是在“級(jí)數(shù)”那里的習(xí)題中出現(xiàn)的,而且還不少。還是從例子開(kāi)始吧:?

f(x)=f(x-1)+x*x ,其中x>0f(0)=0f(4)
:??由于f(0)=0:
當(dāng)x=1?時(shí)?f(1)=f(0)+1*1=1;
當(dāng)x=2?時(shí)?f(2)=f(1)+2*2=5;
當(dāng)x=3?時(shí)?f(3)=f(2)+3*3=14;
當(dāng)x=4?時(shí)?f(4)=f(3)+4*4=30;
所以, f(4)=30.
上學(xué)的時(shí)候,可能會(huì)這樣做出來(lái)。?

f(x)=f(x-1)+x*x ,其中x>0f(0)=0就是一個(gè)遞歸函數(shù),它用到了f(x)是用f(x-1)定義的。細(xì)心的人還可以發(fā)現(xiàn)x>0f(0)=0也是函數(shù)的一部分:
x>0提供一個(gè)遞歸區(qū)間,而f(0)=0提供了一個(gè)初始條件(思維方向不同,在電腦思維中這個(gè)條件為終止條件,詳見(jiàn)下文)
或許大家覺(jué)得和我們課堂上的遞歸還是有點(diǎn)不同,不同在哪呢??

這就是人腦和電腦的區(qū)別:?
電腦不會(huì)直接去找初始條件去向問(wèn)題遞推。?
而是從問(wèn)題出發(fā),遞推下去,直到找到終止條件(解題時(shí)的初始條件)

電腦思維:?
f(4)=f(3)+4*4;?
f(3)=f(2)+3*3?
f(2)=f(1)+2*2?
f(1)=f(0)+1*1?
f(0)=0;??????????????????????????????????//終止條件
f(1)=f(0)+1*1=1;?
f(2)=f(1)+2*2=5;?
f(3)=f(2)+3*3=14;?
f(4)=f(3)+4*4=30;?

這個(gè)是電腦的思維過(guò)程,也就是計(jì)算過(guò)程,不會(huì)在前臺(tái)顯示出來(lái)。?
“遇到問(wèn)題,解決問(wèn)題,輸出結(jié)果”——這是電腦處理問(wèn)題的流程。?
關(guān)鍵在于,怎么寫(xiě)個(gè)遞歸函數(shù)讓電腦認(rèn)識(shí)。?
明白遞歸函數(shù)的定義,其實(shí)很簡(jiǎn)單。?

遞歸函數(shù)有三個(gè)充分條件:第一是函數(shù)體,第二是遞歸區(qū)間,第三個(gè)是終止條件

只要在代碼中全部申明出來(lái),一個(gè)遞歸函數(shù)的就寫(xiě)出來(lái)了。
???????

上面的遞歸函數(shù)的就可以寫(xiě)出下面的代碼:

[cpp]?view plaincopy
  • function?squaresum($x){???
  • ????????if($x>0)???????????????????????????????????????????????????//遞歸區(qū)間???
  • ???????????????$result=squaresum($x-1)+$x*$x;????????//函數(shù)體???
  • ????????elseif($x=0)??????????????????????????????????????????????//終止條件???
  • ???????????????return?$result=0;???
  • ????????return?$result;???
  • }???
  • echo?squaresum(4);?//輸出30???

  • ?

    其中用到了if...elseif…語(yǔ)句,這就是來(lái)聲明遞歸函數(shù)的遞歸區(qū)間終止條件(x>0f(0)=0)的。

    現(xiàn)在在來(lái)寫(xiě)一個(gè)正整數(shù)nn!的遞歸函數(shù)就思路很明確了。?
    分析:正整數(shù)n , f(n)=n!??=>??
    函數(shù)體:f(n)=n*f(n-1)??遞歸區(qū)間:n.> 1????終止條件:n=1

    [cpp]?view plaincopy
  • function?rank($n)??
  • {???
  • ????????if($n>1)???
  • ???????????????$result=$n*rank($n-1);???
  • ????????elseif($n=1)???
  • ???????????????return?$result=1;???
  • ????????return?$result.'<br>';???
  • }???



  • 由此我們可以發(fā)現(xiàn)當(dāng)要寫(xiě)一個(gè)遞歸函數(shù),找到終止條件,一個(gè)遞歸函數(shù)就很明朗了,剩下就是語(yǔ)法問(wèn)題了

    ?

    到linux C這塊,我們做一個(gè)例題:

    例:求斐波那契數(shù)列第n項(xiàng)。斐波那契數(shù)列的第一項(xiàng)和第二項(xiàng)是1,后面每一項(xiàng)是前兩項(xiàng)之和,即1,1,2,3,5,8,13,。。。

    下面程序采用直接遞歸調(diào)用:

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • long?fib(int?n)??
  • {??
  • ????if(n?==?0?||?n?==?1)??
  • ????????return?1;??
  • ????else??
  • ????????return?(fib(n-1)+fib(n-2));??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?i;??
  • ??
  • ????for(i?=?0;i?<?8;i++)??
  • ????????printf("%ld?",fib(i));??
  • ????printf("\n");??
  • ??
  • ????return?0;??
  • }??

  • 程序執(zhí)行結(jié)果如下:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/digui$?./digui1??
  • 1?1?2?3?5?8?13?21???

  • 遞歸的條件:

    上面已經(jīng)簡(jiǎn)單提到,現(xiàn)在再說(shuō)明一下

    一個(gè)問(wèn)題能否用遞歸來(lái)實(shí)現(xiàn),看其是否有如下特點(diǎn):

    1、須有完成函數(shù)任務(wù)的語(yǔ)句。

    例如:下面的代碼定義了一個(gè)遞歸函數(shù)

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • void?count(int?val)??
  • {??
  • ????if?(val?>?1)??
  • ????????count(val?-?1);??
  • ????printf("OK:%d\n",val);??
  • }??


  • 該函數(shù)的任務(wù)是在輸出設(shè)備上顯示”ok: 整數(shù)值“。

    2、一個(gè)任務(wù)是否能夠避免遞歸調(diào)用的測(cè)試。

    例如,上面的代碼中,語(yǔ)句"if (val? > 1)"便是一個(gè)測(cè)試,如果不滿足條件,就不進(jìn)行遞歸調(diào)用。

    3、一個(gè)遞歸調(diào)用語(yǔ)句

    該遞歸調(diào)用語(yǔ)句的參數(shù)應(yīng)該逐漸逼近不滿足條件,以至最后斷絕遞歸。

    例如,上面的代碼匯總,語(yǔ)句 "if( val > 1)"便是一個(gè)遞歸調(diào)用,參數(shù)在漸漸變小,這話總發(fā)展趨勢(shì)能使測(cè)試 "if (val > 1)"最終不滿足。

    4,、先測(cè)試,后遞歸調(diào)用

    在遞歸函數(shù)定義中,必須先測(cè)試,后遞歸調(diào)用。也就是說(shuō),遞歸調(diào)用是有條件的,滿足了條件,才可以遞歸。

    例如,下面的代碼無(wú)限制的調(diào)用函數(shù)自己,造成無(wú)限制遞歸,終將使棧空間溢出;

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • void?count(int?val)??
  • {??
  • ????count(val?-?1);//無(wú)限制遞歸??
  • ?????????if?(val?>?1)??
  • ????????printf("OK:%d\n",val);??
  • }??

  • 下面是完整程序:

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • void?count(int?val)??
  • {??
  • ????if?(val?>?1)??
  • ????????count(val?-?1);??
  • ????printf("OK:%d\n",val);??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?n?=?10;??
  • ??
  • ????count(n);??
  • ??
  • ????return?0;??
  • }??
  • ?

    程序執(zhí)行結(jié)果如下:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/digui$?vi?digui2.c??
  • fs@ubuntu:~/qiang/digui$?gcc?-o?digui2?digui2.c???
  • fs@ubuntu:~/qiang/digui$?./digui2??
  • OK:1??
  • OK:2??
  • OK:3??
  • OK:4??
  • OK:5??
  • OK:6??
  • OK:7??
  • OK:8??
  • OK:9??
  • OK:10??
  • fs@ubuntu:~/qiang/digui$???

  • 遞歸的應(yīng)用會(huì)繼續(xù)更新,比如在二叉樹(shù)的遍歷

    總結(jié)

    以上是生活随笔為你收集整理的Linux C学习---递归函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。