亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c語言 深入理解函數(shù)的遞歸

 更新時(shí)間:2022年02月09日 15:13:55   作者:誠(chéng)摯的喬治  
這一章講解的是函數(shù)的遞歸,因?yàn)檫f歸函數(shù)是一個(gè)非常重要求解復(fù)雜問題的方法之一,在學(xué)習(xí)算法的過程之中我們也會(huì)遇到他,所以我想對(duì)它進(jìn)行一次講解,希望能幫助其他人,也能幫助我自己來梳理一遍。下面我會(huì)通過一些題目的講解去認(rèn)識(shí)遞歸函數(shù)

前言:

?首先,遞歸是什么,遞歸就是在定義函數(shù)時(shí),然后在函數(shù)里調(diào)用這個(gè)函數(shù),通俗講,就是函數(shù)自己調(diào)用自己。那么遞歸的好處是什么呢?它能夠?qū)?fù)雜的問題,用少量的代碼來表示,增加了代碼的可讀性。

但是遞歸有一個(gè)條件,就是每一次的重復(fù)調(diào)用都需要越接近這個(gè)限制條件。

1.用遞歸打印一個(gè)整數(shù)的每一位

題目的要求是打印一個(gè)整數(shù)的每一位,就比如說1234,打印的結(jié)果就是1234,我們學(xué)過用循環(huán)打印過4321,但順著打印,用循環(huán)來做,相對(duì)于遞歸來解,就會(huì)有點(diǎn)復(fù)雜。

#include<stdio.h>//打印一個(gè)整數(shù)的每一位,用遞歸
print(int n)
{
	int i = 0;
	if(n>9)
	{
		print(n / 10);
	}
	printf("%d", n%10);
}
int main()
{
	int num = 0;
	printf("請(qǐng)輸入一個(gè)整數(shù):");
	scanf("%d",&num);
	print(num);
	return 0;
}

這道題就是利用了遞歸的思想,此時(shí)的遞歸函數(shù)就是print函數(shù)。

首先是遞歸中的“遞”

當(dāng)我們?cè)趕canf函數(shù)中輸入一個(gè)整數(shù)1234時(shí),第一次進(jìn)入print函數(shù)里,通過if語句再次進(jìn)入print函數(shù)里,注意這時(shí)還未進(jìn)行printf打印出結(jié)果。

這就到了第二次進(jìn)入print函數(shù)里,此時(shí)進(jìn)入函數(shù)的數(shù)子不在時(shí)?1234,而是除以十后的123,進(jìn)入print函數(shù)后,再次通過if語句,進(jìn)入print函數(shù),注意這時(shí)也還未進(jìn)行printf打印出結(jié)果。

第三次進(jìn)入print函數(shù)里,是除以十后的12,12依然大于9,所以再次通過if語句,進(jìn)入print函數(shù),這時(shí)進(jìn)入print函數(shù)的是除以十后的1.注意這時(shí)也還未進(jìn)行printf打印出結(jié)果

第四次調(diào)用print函數(shù)時(shí),此時(shí)的n就是1,顯然不滿足大于9的條件。這時(shí)的1余以十的結(jié)果還是1,于是首先打印出1。

然后就是遞歸中的“歸”

打印完1后,第四次進(jìn)入循環(huán)的過程就結(jié)束了,此時(shí),接著歸回上一次的循環(huán),我們知道上次的循環(huán)到進(jìn)入if語句后,就沒有再次往下進(jìn)行,歸時(shí)就接著上次的操作,往下進(jìn)行運(yùn)行,就打印12余十的結(jié)果2,同理,就打印出最終的1234.

2.遞歸求n的階乘

你是否還記得上次求n的階乘還是說在上次。這次用遞歸來求解n的階乘,實(shí)際上也是非常的簡(jiǎn)單,先寫出不用遞歸來求n的循環(huán)。

#include<stdio.h>//求n的階乘
int main()
{
	int num = 0; int i = 0; int ret = 1;
	printf("請(qǐng)輸入一個(gè)值:");
	scanf("%d",&num);
	for (i = 2; i <=num; i++)
	{
		ret *= i;
	}
	printf("%d", ret);
	return 0;
}

然后就是遞歸求n的階乘:

#include<stdio.h>//求n的階乘
int fac(int n)
{
	if (n > 1)
		return n * fac(n - 1);
	else
		return 1;
}
int main()
{
	int ret = 0;
	int num = 0;
	printf("請(qǐng)輸入n的值:");
	scanf("%d", &num);
	ret=fac(num);
	printf("%d", ret);
	return 0;
}

這時(shí)的n就是輸入的值,fac(n-1)就重復(fù)調(diào)用此函數(shù),又可以無限接近這個(gè)n大于1的這個(gè)條件。這就用到了遞歸的思想。我們知道求n的階乘,也可以表示成n乘以(n-1)的階乘。以此重復(fù),n-1等于1時(shí)就停止。就達(dá)到求n的階乘的目的~~

3.用遞歸和非遞歸求字符串的長(zhǎng)度

求字符串的長(zhǎng)度,不就是strlen函數(shù)嗎?

但是,不用這個(gè)庫函數(shù)呢

我們依然可以用兩種方法進(jìn)行求解。

首先用非遞歸來求字符串的長(zhǎng)度,也就是用我們自己的my_strlen函數(shù)。

#include<stdio.h>//用非遞歸求字符串的長(zhǎng)度
my_strlen(char *arr)
{
	int a = 0; int ret = 0;
	char c = *(arr+a);
	while(arr[a] != '\0')
	{
		a++;
		ret++;
		}
	return ret;
}
int main()
{
	int ret = 0;
	char arr[] = "abc";
	ret=my_strlen(arr);
 	printf("%d", ret);
	return 0;
}

遞歸如下:

#include<stdio.h>
my_strlen(char* arr)
{
	int i = 0;
	if (*arr == '\0')
		return 0;
	if (*arr != '\0')
		return 1 + my_strlen(arr + 1);
}
int main()
{
	int ret = 0;
	char arr[] = "abc";
	ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

這道題的思路就是一個(gè)一個(gè)字符來數(shù),知道\0來結(jié)束此程序,我們知道“abc”是由abc\0四個(gè)字符組成,而遞歸的思路就是先數(shù)出a這個(gè)字符然后再數(shù)b,直到\0結(jié)束。

4.輸入一個(gè)數(shù)求各位數(shù)之和

這題的意思就是求出一個(gè)整數(shù)個(gè)十百千位之和,比如1234結(jié)果為10;

#include<stdio.h>//輸入一個(gè)數(shù)求各位數(shù)之和
sum(int x)
{
	int ret = 0;
	if (x > 9)
	{
		return  x % 10 + sum(x / 10);
	}
	else
		return x;
}
int main()
{
	int num = 0;
	printf("請(qǐng)輸入一個(gè)數(shù)之和:");
	scanf("%d", &num);
	printf("%d",sum(num));
	return 0;
}

5.用遞歸求n的k次方

#include<stdio.h>//用遞歸求n的k次方
tmp(int x,int y)
{
	if (y <= 0)
	{
		return 1;
	}
	else
		return x * tmp(x, y - 1);
}
int main()
{
	int k = 0; int n = 0;
	printf("請(qǐng)輸入一個(gè)n和k:");
	scanf("%d %d",&n, &k);
	int ret=tmp(n,k);
	printf("%d", ret);
	return 0;
}

6.計(jì)算斐波那契數(shù)

#include<stdio.h>//計(jì)算斐波那契數(shù)
feibona(int n)
{
	
	if (n >= 3)
		return feibona(n - 1) + feibona(n - 2);
	else 1;
}
int main()
{
	int n = 0;
	printf("請(qǐng)輸入一個(gè)n:");
	scanf("%d", &n);
	int ret=feibona(n);
	printf("%d", ret);
	return 0;
}

斐波那契數(shù)就是1 1 2 3 5 8 13……前兩個(gè)數(shù)之和得到第三個(gè)數(shù)

這里給出不用遞歸的求解:

#include<stdio.h>//用非遞歸求斐波那契數(shù)\
int feibona(int N)
{
int i = 1;
int j = 1;
int sum = i + j;
for (i = 4; i <= N; i++)
{
	i = j;
	j = sum;
	sum = i + j;
}
return sum;
}
int main()
{
	printf("請(qǐng)輸入一個(gè)n:");
	scanf("%d",&n);
	int ret=feibona(n);
	printf("%d", ret);
	return 0;
}

結(jié)語:

以上這些都利用到了遞歸函數(shù)的求解方法,思想都是差不多的,如果你仔細(xì)琢磨,會(huì)發(fā)現(xiàn)遞歸的魅力,這些例題可以拿來復(fù)習(xí),歡迎大家支持 點(diǎn)贊 收藏~~

到此這篇關(guān)于c語言 深入理解函數(shù)的遞歸的文章就介紹到這了,更多相關(guān)c語言 函數(shù)遞歸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)實(shí)驗(yàn)設(shè)備管理系統(tǒng)

    C語言實(shí)現(xiàn)實(shí)驗(yàn)設(shè)備管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)實(shí)驗(yàn)設(shè)備管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 使用C++實(shí)現(xiàn)FTP上傳和下載

    使用C++實(shí)現(xiàn)FTP上傳和下載

    當(dāng)在Windows上使用C++進(jìn)行FTP上傳和下載時(shí),您可以使用libcurl庫來簡(jiǎn)化操作,本文將為大家詳細(xì)介紹具體步驟,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • opencv利用霍夫變換檢測(cè)直線進(jìn)行圖片校正

    opencv利用霍夫變換檢測(cè)直線進(jìn)行圖片校正

    這篇文章主要為大家詳細(xì)介紹了opencv利用霍夫變換檢測(cè)直線對(duì)圖片進(jìn)行校正,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言lseek()函數(shù)詳解

    C語言lseek()函數(shù)詳解

    這篇文章主要介紹了C語言lseek()函數(shù)詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • OPENMP?SECTIONS?CONSTRUCT原理示例解析

    OPENMP?SECTIONS?CONSTRUCT原理示例解析

    這篇文章主要為大家介紹了OPENMP?SECTIONS?CONSTRUCT原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 從C語言過渡到C++之const

    從C語言過渡到C++之const

    C++中最早引入const是為了替代#define,后來又衍生出了其它用法。這一篇中我們來詳細(xì)介紹const的各種常見用法。希望對(duì)大家學(xué)習(xí)C++有所幫助。
    2017-07-07
  • 基于Opencv實(shí)現(xiàn)顏色識(shí)別

    基于Opencv實(shí)現(xiàn)顏色識(shí)別

    這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)顏色識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C語言版掃雷游戲

    C語言版掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言版掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 在std::thread中創(chuàng)建并管理QEventLoop的全面解析

    在std::thread中創(chuàng)建并管理QEventLoop的全面解析

    QEventLoop的工作原理可以簡(jiǎn)單地理解為一個(gè)無限循環(huán),它會(huì)不斷地檢查是否有新的事件需要處理,如果有,就將事件從事件隊(duì)列中取出,然后找到相應(yīng)的事件處理器進(jìn)行處理,這篇文章主要介紹了在std::thread中創(chuàng)建并管理QEventLoop的全面指南,需要的朋友可以參考下
    2023-06-06
  • C++?pthread入門指南

    C++?pthread入門指南

    pthread是C++98接口且只支持Linux,使用時(shí)需要包含頭文件#include?<pthread.h>,編譯時(shí)需要鏈接pthread庫,其中p是POSIX的縮寫,而POSIX是Portable?Operating?System?Interface的縮寫,這篇文章主要介紹了C++?pthread簡(jiǎn)介,需要的朋友可以參考下
    2024-05-05

最新評(píng)論