欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言函數(shù)的基本使用和遞歸小結(jié)

 更新時間:2021年09月06日 10:53:45   作者:周周汪  
這篇文章主要介紹了C語言函數(shù)的基本使用和遞歸小結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

本章目標(biāo)

禿頭俠們好呀,今天我們一起學(xué)習(xí)函數(shù)!

目標(biāo): 本章主要掌握函數(shù)的基本使用和遞歸

函數(shù)是什么

數(shù)學(xué)中我們常見到函數(shù)的概念。但是你了解C語言中的函數(shù)嗎? 維基百科中對函數(shù)的定義:子程序

在計算機(jī)科學(xué)中,子程序(英語:Subroutine, procedure, function, routine, method,subprogram, callable unit),是一個大型程序中的某部分代碼, 由一個或多個語句塊組成。它負(fù)責(zé)完成某項特定任務(wù),而且相較于其他代 碼,具備相對的獨(dú)立性。
一般會有輸入?yún)?shù)并有返回值,提供對過程的封裝和細(xì)節(jié)的隱藏。這些代碼通常被集成為軟件庫。

C語言中函數(shù)的分類

  • 庫函數(shù)
  • 自定義函數(shù)

庫函數(shù)

為什么會有庫函數(shù)?

  • 我們知道在我們學(xué)習(xí)C語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結(jié)果,想把這個結(jié)果打印到我們的屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格式打印到屏幕上(printf)。
  • 在編程的過程中我們會頻繁的做一些字符串的拷貝工作(strcpy)。
  • 在編程是我們也計算,總是會計算n的k次方這樣的運(yùn)算(pow)。

像上面我們描述的基礎(chǔ)功能,它們不是業(yè)務(wù)性的代碼。我們在開發(fā)的過程中每個程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語言的基礎(chǔ)庫中提供了一系列類似的庫函數(shù),方便程序員進(jìn)行軟件開發(fā)。

那怎么學(xué)習(xí)庫函數(shù)呢?

這里我們簡單的看看:https://www.cplusplus.com

在這里插入圖片描述

簡單的總結(jié),C語言常用的庫函數(shù)都有:

  • IO函數(shù)
  • 字符串操作函數(shù)
  • 字符操作函數(shù)
  • 內(nèi)存操作函數(shù)
  • 時間/日期函數(shù)
  • 數(shù)學(xué)函數(shù)
  • 其他庫函數(shù)

注: 但是庫函數(shù)必須知道的一個秘密就是:使用庫函數(shù),必須包含 #include 對應(yīng)的頭文件。

如何學(xué)會使用庫函數(shù)?

庫函數(shù)不用全部記憶,需要的時候在此網(wǎng)址查找即可https://www.cplusplus.com
所以看懂英文很重要,當(dāng)然你也可以選擇翻譯軟件

自定義函數(shù)

如果庫函數(shù)能干所有的事情,那還要程序員干什么?

所以更加重要的是自定義函數(shù)。

自定義函數(shù)和庫函數(shù)一樣,有函數(shù)名,返回值類型和函數(shù)參數(shù)。 但是不一樣的是這些都是我們自己來設(shè) 計。這給程序員一個很大的發(fā)揮空間

函數(shù)的組成:

ret_type fun_name(para1, * )
{
statement;//語句項
}
ret_type 返回類型
fun_name 函數(shù)名
para1 函數(shù)參數(shù)

這里我們來舉一個例子:

寫一個函數(shù)可以找出兩個整數(shù)中的最大值

#include <stdio.h>
//get_max函數(shù)的設(shè)計
int get_max(int x, int y)
{
return (x>y)?(x):(y);
}
int main()
{
int num1 = 10;
int num2 = 20;
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}

return (x>y)?(x):(y);此語句的意思是判斷X是否大于Y,如果X>Y則選擇左邊的X值,否則選擇右邊的Y值。

函數(shù)的參數(shù)

實際參數(shù)(實參):

真實傳給函數(shù)的參數(shù),叫實參。實參可以是:常量、變量、表達(dá)式、函數(shù)等。無論實參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須有確定的值,以便把這些值傳送給形參。

形式參數(shù)(形參):

形式參數(shù)是指函數(shù)名后括號中的變量,因為形式參數(shù)只有在函數(shù)被調(diào)用的過程中才實例化(分配內(nèi)存單元),所以叫形式參數(shù)。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。因此形式參數(shù)只在函數(shù)中有效。

—————————————————————————

寫一個函數(shù)可以交換兩個整形變量的內(nèi)容

#include <stdio.h>
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
void Swap2(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0;
}

上面代碼Swap1Swap2函數(shù)中的參數(shù) x,y,px,py 都是形式參數(shù)。在main函數(shù)中傳給Swap1num1,num2和傳給Swap2函數(shù)的&num1,&num2是實際參數(shù)。

經(jīng)分析:

在這里插入圖片描述在這里插入圖片描述

這里可看到Swap1函數(shù)在調(diào)用時,x,y擁有自己的空間,同時擁有了和實參一樣的內(nèi)容。所以我們可以簡單的認(rèn)為:形參實例化之后其實相當(dāng)于實參的一份臨時拷貝
Swap2函數(shù)在調(diào)用時,px,py沒有再開辟空間,而就是num1,num2的地址。

函數(shù)的調(diào)用:

傳值調(diào)用

函數(shù)的形參和實參分別占有不同內(nèi)存塊,對形參的修改不會影響實參。

傳址調(diào)用

傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。
這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起正真的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量

函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問

函數(shù)和函數(shù)之間可以有機(jī)的組合的。

嵌套調(diào)用

#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
	{
new_line();
	}
}
int main()
{
three_line();
return 0;
}

鏈?zhǔn)皆L問

把一個函數(shù)的返回值作為另外一個函數(shù)的參數(shù)

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[20] = "hello";
	int ret = strlen(strcat(arr, "bit"));
	printf("%d\n", ret);
	return 0;
}

自己按照前面說的網(wǎng)址去學(xué)習(xí)一下 strlenstrcat 看看這題答案是多少

在這里插入圖片描述

這個結(jié)果又是多少呢?

#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}

這里需要知道printf函數(shù)的返回值是多少
printf函數(shù)的返回值是打印的字符數(shù)
此題從最里面一層看printf("%d", 43)先打印出來43
因為是2個字符,所以返回值為2
printf("%d", printf("%d", 43))相當(dāng)于printf("%d", 2)
然后打印2,因為是1個字符,所以返回1
printf("%d", printf("%d", printf("%d", 43)))相當(dāng)于printf("%d", 1)
所以最終打印4321

在這里插入圖片描述

函數(shù)的聲明和定義

函數(shù)聲明:

告訴編譯器有一個函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在,無關(guān)緊要。函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足先聲明后使用。函數(shù)的聲明一般要放在頭文件中的。

函數(shù)定義:

函數(shù)的定義是指函數(shù)的具體實現(xiàn),交待函數(shù)的功能實現(xiàn)。

所以可以在比如test.h里放函數(shù)的聲明
test.c中放函數(shù)的定義實現(xiàn)

函數(shù)遞歸

什么是遞歸?

程序調(diào)用自身的編程技巧稱為遞歸( recursion)。 遞歸做為一種算法在程序設(shè)計語言中廣泛應(yīng)用。一個過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個大型復(fù)雜的問題層層轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計算,大大地減少了程序的代碼量。 遞歸的主要思考方式在于:把大事化小

遞歸的兩個必要條件

  • 存在限制條件,當(dāng)滿足這個限制條件的時候,遞歸便不再繼續(xù)。
  • 每次遞歸調(diào)用之后越來越接近這個限制條件

接受一個整型值(無符號),按照順序打印它的每一位。 例如: 輸入:1234,輸出 1 2 3 4

#include<stdio.h>
#include<string.h>
void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int num = 1234;
	print(num);
	return 0;
}

編寫函數(shù)不允許創(chuàng)建臨時變量,求字符串的長度。

#include <stdio.h>
int Strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else return 1 + Strlen(str + 1);
}
int main()
{
	char* p = "abcdef";
	int len = Strlen(p);
	printf("%d\n", len);
	return 0;
}

以上兩個代碼,都是對函數(shù)遞歸的使用

遞歸與迭代

求n的階乘。(不考慮溢出)

int factorial(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * factorial(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = factorial(n);
	printf("%d\n", ret);
	return 0;
}

求第n個斐波那契數(shù)。(不考慮溢出)

首先什么是斐波那契數(shù)?

就是前兩數(shù)之和等于第三個數(shù)

int fib(int n)
{
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}

運(yùn)行結(jié)果需要很長時間才顯示出來為什么?

我們發(fā)現(xiàn)出現(xiàn)了問題

  • 在使用 fib 這個函數(shù)的時候如果我們要計算第50個斐波那契數(shù)字的時候特別耗費(fèi)時間。
  • 使用factorial函數(shù)求10000的階乘(不考慮結(jié)果的正確性),程序會崩潰

我們發(fā)現(xiàn) fib 函數(shù)在調(diào)用的過程中很多計算其實在一直重復(fù)

int count = 0;//全局變量
int fib(int n)
{
if(n == 3)
count++;
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}

我們用一段代碼來看一下,結(jié)果發(fā)現(xiàn)count是一個很大的值,說明代碼重復(fù)計算了很多次

在調(diào)試 factorial 函數(shù)的時候,如果你的參數(shù)比較大,那就會報錯: stack overflow(棧溢出) 這樣的信息。 系統(tǒng)分配給程序的??臻g是有限的,但是如果出現(xiàn)了死循環(huán),或者(死遞歸),這樣有可能導(dǎo)致一直開辟??臻g,最終產(chǎn)生??臻g耗盡的情況,這樣的現(xiàn)象我們稱為棧溢出。

所以有時使用遞歸可以簡化問題,有時反而把問題復(fù)雜了

調(diào)整后:

//求n的階乘
int factorial(int n)
{
	int tmp = 1;
	while (n > 1)
	{
		tmp *= n;
		n -= 1;
	}
	return tmp;
}
//求第n個斐波那契數(shù)
#include<stdio.h>
int Fib(int n)
{
	int a = 1, b = 1, 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;
}

所以要根據(jù)不同的情況使用不同的方法,才能使得問題更高效地解決!

到此這篇關(guān)于C語言函數(shù)的基本使用和遞歸小結(jié)的文章就介紹到這了,更多相關(guān)C語言函數(shù)遞歸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言水仙花數(shù)的實現(xiàn)

    C語言水仙花數(shù)的實現(xiàn)

    這篇文章主要介紹了C語言水仙花數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點(diǎn)

    C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點(diǎn)

    工廠方法模式是一個創(chuàng)建型設(shè)計模式,通過定義一個創(chuàng)建對象的接口,讓其子類決定實例化哪一個工廠類,這篇文章主要給大家介紹了關(guān)于C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點(diǎn),需要的朋友可以參考下
    2021-06-06
  • 5分鐘內(nèi)了解C語言的指針

    5分鐘內(nèi)了解C語言的指針

    這篇文章主要介紹了5分鐘內(nèi)了解C語言的指針,本文講解了指針、引用和取值、void指針、NULL指針和未初始化指針、指針和數(shù)組等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • linux之sed命令的用法

    linux之sed命令的用法

    sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進(jìn)行處理,可以將數(shù)據(jù)行進(jìn)行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法
    2013-10-10
  • 詳解如何從Matlab中導(dǎo)出清晰的結(jié)果圖片

    詳解如何從Matlab中導(dǎo)出清晰的結(jié)果圖片

    寫文章的時候有時需要matlab導(dǎo)出清晰的圖片,如果直接用figure里面的保存的話不夠清晰,下面這篇文章主要給大家介紹了關(guān)于如何從Matlab中導(dǎo)出清晰的結(jié)果圖片的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Visual Studio2000系列版本安裝OpenGL的圖文教程

    Visual Studio2000系列版本安裝OpenGL的圖文教程

    這篇文章主要介紹了Visual Studio2000系列版本安裝OpenGL的圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • OpenCV通過透視變換實現(xiàn)矯正圖像詳解

    OpenCV通過透視變換實現(xiàn)矯正圖像詳解

    這篇文章主要為大家詳細(xì)介紹了OpenCV如何通過透視變換實現(xiàn)將一張折射的圖片給矯正過來,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • C/C++實現(xiàn)圖書信息管理系統(tǒng)

    C/C++實現(xiàn)圖書信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了c/c++實現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言修煉之路悟徹數(shù)組真妙理?巧用下標(biāo)破萬敵上篇

    C語言修煉之路悟徹數(shù)組真妙理?巧用下標(biāo)破萬敵上篇

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • C語言在頭文件中定義const變量詳解

    C語言在頭文件中定義const變量詳解

    這篇文章主要介紹了C語言在頭文件中定義const變量詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論