1. 程式人生 > >C語言學習第23篇---遞迴函式理解

C語言學習第23篇---遞迴函式理解

遞迴函式:自己呼叫自己,是子函式實現的基礎。遞迴之所以能實現,是因為函式的每個執行過程在棧中都有自己的形參和區域性變數的副本,這些副本和該函式的其他執行過程不發生關係但是遞迴函式在深層迴圈時效率很低,所以一般不是必須還是不要使用遞迴,即使用也不要層次很深#include<stdio.h>void DisplayNames(char** cNameArray);/*宣告函式*/char* cNames[]=/*定義字串陣列*/{"Aaron",/*為字串進行賦值*/"Jim","Charles","Sam","Ken","end"/*設定結束標誌*/};int main(){    DisplayNames
(cNames);/*呼叫遞迴函式*/
return 0;}void DisplayNames(char** cNameArray){if(*cNameArray=="end")/*判斷結束標誌*/{return ;/*函式結束返回*/}else{        DisplayNames(cNameArray+1);/*呼叫遞迴函式*/        printf("%s\n",*cNameArray);/*輸出字串*/}} 內部:static 返回值型別 函式名 (引數列表)#include<stdio.h>static char* GetString(char* pString)/*定義賦值函式*/{return
pString;/*返回字元*/
}static void ShowString(char* pString)/*定義輸出函式*/{    printf("%s\n",pString);/*顯示字串*/}int main(){char* pMyString;/*定義字串變數*/    pMyString=GetString("Hello!");/*呼叫函式為字串賦值*/    ShowString(pMyString);/*顯示字串*/return 0;}外部: extern int Add(int iNum1,int iNum2);外部函式是可以被其他原始檔呼叫的函式#include<stdio.h>extern
char* GetString(char* pString);/*宣告外部函式*/
extern void ShowString(char* pString);/*宣告外部函式*/int main(){char* pMyString;/*定義字串變數*/    pMyString=GetString("Hello!");/*呼叫函式為字串賦值*/    ShowString(pMyString);/*顯示字串*/return 0;}extern void ShowString(char* pString){    printf("%s\n",pString);/*顯示字串*/}extern char* GetString(char* pString){return pString;/*返回字元*/}*********************************************************************************************************************************分割線*********************************************************************************************************************************遞迴函式的難點在於展開函式不要錯誤就ok了void fun(int i){ if (i>0) {    fun(i/2); }    printf("%d\n",i);}int main(){    fun(10); return 0;}/*012510*/展開之後void fun(int i){ if (i>0) { //fun(i/2); if(i/2>0) { if(i/4>0) {    … }    printf("%d\n",i/4); }    printf("%d\n",i/2); }    printf("%d\n",i);}利用遞迴函式解決問題不使用任何變數編寫 strlen 函式-------字串統計函式int my_strlen( const char* strDest ){    assert(NULL != strDest); //使用assert巨集做入口引數 if ('\0' == *strDest) //確定引數傳遞過來的地址上的記憶體儲存是否為‘\0’. { return 0; //如果是,表明這個是空字元,或者是字串的結束標誌 } else { return (1 + my_strlen(++strDest)); //如果不是,說明地址上儲存的是一個字元,計數為char型別元素1,然後在呼叫函式本身,迴圈,知道出現0,遞迴停止。 }}***更簡單的程式int my_strlen( const char* strDest ){ return *strDest?1+strlen(strDest+1):0;}沒有做引數入口校驗,雖然簡潔但是不是很規範,改進之後為int my_strlen( const char* strDest ){    assert(NULL != strDest); return ('\0' != *strDest)?(1+my_strlen(strDest+1)):0;}--------------------------------------------------------------------------------------------------------------------------------遞迴函式實現階乘;#include<stdio.h>int factorial(int n){if (n < 0)return -1; /*Wrong value*/if (n == 0)return 1; /*Terminating condition*/return (n * factorial(n - 1));}void main() {int fact = 0;fact = factorial(5);printf("\n factorial of 5 is %d \n", fact);}/*

相關推薦

C語言學習23---函式理解

遞迴函式:自己呼叫自己,是子函式實現的基礎。遞迴之所以能實現,是因為函式的每個執行過程在棧中都有自己的形參和區域性變數的副本,這些副本和該函式的其他執行過程不發生關係但是遞迴函式在深層迴圈時效率很低,所

C語言學習19---break與continue與return使用總結

break:滿足條件後跳出迴圈(多層迴圈一次跳出一層),也就是說先跳出內部迴圈main(){    int i=0;    char c;    while(1) /*設定迴圈*/    {      

C語言基礎——函式

一、定義 直接或間接呼叫函式本身,則該函式稱為遞迴函式 二、兩個要點 (1)趨近於一個臨界值 (2)呼叫自己本身 三、舉例 (1)求n! int Fun(int n) { int tmp=n; if(n==1)//臨界值 { tmp=n; return

C語言 9 節 函式的使用

#include <stdio.h> void down(int); int main() { down(1); return 0; } void down(int n){

R語言學習 :列表

方法 靈活的數據類型 引號 bounds 參考 最大的 post 長度 索引操作 列表(List)是R中最復雜的數據類型,一般來說,列表是數據對象的有序集合,但是,列表的各個元素(item)的數據類型可以不同,每個元素的長度可以不同,是R中最靈活的數據類型。列表項可以是列表

C語言學習日記第一C語言概述)

C語言學習日記第一篇——C語言概述 一,C語言概述 如果要說目前什麼語言最為火熱,人們可能會說Python、Android,學好這些語言可以讓你很輕鬆的找到一份收入不菲的工作,過上舒適的生活。但是,小編覺得,如果要說什麼語言最重要,還是得回到C語言上來。我們平時所談論到的所有語言的發

C語言(四 檔案操作、

檔案讀寫 我們用**fopen()**來新建一個檔案或開啟一個已有的檔案. 函式原型為File *fopen(const char *filename , const char *mode) filename是檔名,mode代表訪問方式。 mode

C語言N叉樹非(前中後遍歷法)

#include <stdio.h> #include <stdlib.h> typedef struct kk { char ch; int flag; struct kk *left; struct kk *right; }btr

c++學習總結(二)——函式

一、心得感悟     關於函式之前有過總結,函式是在程式設計中為簡化主程式、使複雜程式簡單化的子程式。而遞迴函式則是一種特殊的函式。它是直接或間接呼叫的函式,通常可以把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。遞迴策略只需少量的程式就可以描述出解題過程

C語言實現快速排序(

#include<stdio.h> void Split(int left,int a[],int right); int Quicksort(int left,int a[],int right); int main() { int N; scanf("

Python 語言學習 :陣列型別(列表、字典和元組)

列表和欄位都可以在原處進行修改,可以按照需求增長或縮短,並且可以包含任何型別的物件或被巢狀。列表和字典儲存的是物件的引用,而不是拷貝。 一,列表 列表是有序的序列,每一個列表項的順序是固定的,這使得列表可以通過指定的偏移來索引和分片。列表是可變的序列,支援在原處修改。 列表項可以是任何型別,或物件,也可

Python 語言學習 :動態型別模型

Python的變數不用宣告,賦值之後就可以直接使用,型別是在執行過程中自動確定的,這就是動態型別模型。該模型把變數和物件設計成兩個不同的實體,物件是儲存資料的地方,物件的型別是由初始值自動決定的,而變數僅僅是物件的引用。變數是通用的,同一個變數名可以引用任何型別的物件。 一,變數、物件和引用 動態型別模型

Python 語言學習 :迭代和解析

Python 語言學習 第六篇:迭代和解析 Python中的迭代是指按照元素的順序逐個呼叫的過程,迭代概念包括:迭代協議、可迭代物件和迭代器三個概念。 迭代協議是指有__next__()函式的物件會前進到下一個結果,而到達系列的末尾時,則會引發StopIteration異常。為了支援迭代協議

Python 語言學習 函式1(定義、呼叫和變數的作用域)

函式是把一些語句集合在一起的程式結構,用於把複雜的流程細分成不同的元件,能夠減少程式碼的冗餘、程式碼的複用和修改程式碼的代價。 函式可以0個、1個或多個引數,向函式傳遞引數,可以控制函式的流程。函式還可以返回程式碼執行的結果,從技術上講,任何函式都要返回結果,一個沒有返回值的函式會自動返回none物件。如果

Python 語言學習 函式2(引數、lamdba和函式屬性)

函式的引數是引數暴露給外部的介面,向函式傳遞引數,可以控制函式的流程,函式可以0個、1個或多個引數;在Python中向函式傳參,使用的是賦值方式。 一,傳遞引數 引數是通過賦值來傳遞的,傳遞引數的特點是: 引數的傳遞是通過自動把物件賦值給函式的本地變數名來實現的, 在函式內部的變數名的賦值不會

C語言,迭代與

概念 迭代(iteration)是重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重複稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值。 遞迴( recursion)是程式呼叫自身的程式設計技巧。 *迭代跟遞迴本質都是一種方法。而遞迴函式顧

C語言:二分查詢的法、將斐波那契數列改為版本

#include<stdio.h> //二分查詢的遞迴法 void Search(int p[],int low,int height,int key) { int middle=(low+height)/2; if(l

Python 語言學習 :模組

模組是把程式程式碼和資料封裝的Python檔案,也就是說,每一個以副檔名py結尾的Python原始碼檔案都是一個模組。每一個模組檔案就是一個獨立的名稱空間,用於封裝頂層變數名;在一個模組檔案的頂層定義的所有的變數名(函式名也是一個變數名),稱作模組的屬性。匯入模組給予了對模組的全域性作用域中的變數名的讀取權,

c語言學習--數組

一個 printf include 初始 隨機 tchar getchar() highlight num 數組聲明並生成隨機數賦值 要求生成的隨機數的範圍在20-50之間 #include <stdio.h> #include <time.h&

C語言)整數劃分問題

對於一個正整數n的劃分,就是把n變成一系列正整數之和的表示式。注意,分劃與順序無關,例如6=5+1跟6=1+5是 同一種分劃。另外,單獨這個整數本身也算一種分劃。 例如:對於正整數n=5,可以劃分為: 1+1+1+1+1 1+1+1+2 1+1+3 1+2+2 2+3 1+4 5 輸入描述 輸入一個正整