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

C語言中的遞歸,你真的懂了嗎?

 更新時間:2020年11月18日 14:50:21   作者:寫代碼的籃球球癡  
這篇文章主要給大家介紹了關(guān)于C語言中遞歸的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

什么是遞歸?

要說到遞歸如果不說棧的話,我覺得有點不合適,遞歸特點就是不斷的調(diào)用同一個函數(shù),如果這個函數(shù)沒有一個遞歸界限,那么就是死循環(huán)了,所以討論遞歸,就必須要討論遞歸的界限,就是限定這個遞歸調(diào)用多少次。

我們看一個例子

#include "stdio.h"

int digui(unsigned long count )
{
 if(count > 0){
 count --;
 printf("%d \n",count);
 digui(count);
 }
 return 1;
}

int main()
{
 digui(10);
 return (100);
}

這個遞歸函數(shù)的限定判讀是

if(count > 0){

所以他的調(diào)用順序可以用這個圖示來說明

這個過程叫做遞去,也就是壓棧的過程,既然有壓棧的過程,那么就有出棧的過程,出棧的過程就是

if(count > 0){

判斷不成功后,就會出棧了。如下圖所示

一共能執(zhí)行多少次遞歸?

我們上面說到了,既然遞歸使用了棧,那么系統(tǒng)的棧的大小肯定是有極限的,不可能系統(tǒng)給你分配無極限的棧的大小,我看一些文章說棧大小是64K。

還是上面那個例子,我把傳入數(shù)據(jù)設(shè)置為很大執(zhí)行看看。

#include "stdio.h"

int tigui(unsigned long count )
{
 if(count > 0){
 count --;
 printf("%d \n",count);
 tigui(count);
 }
 return 1;
}

int main()
{
 tigui(900000);
 return (100);
}

執(zhí)行結(jié)果

所以說遞歸次數(shù)肯定是有限定的了。

遞歸求階乘

使用遞歸求階乘是很經(jīng)典的方法,我們看一下代碼。

#include<stdio.h>
int fact(unsigned long n); //聲明階乘fact函數(shù)
int main(){
 unsigned long x;
 scanf("%d",&x);
 x = fact(x);//調(diào)用函數(shù)返回int值
 printf("%ld\n",x);
 return (0);
}
int fact(unsigned long n){//定義階乘函數(shù)
 if(n==1) return 1;//輸入的參數(shù)是1,直接返回1
 else return n*fact(n-1);//遞歸算法
}

執(zhí)行結(jié)果

單看代碼我覺得還是有點拗口 我們看個圖片來看他的調(diào)用,假設(shè)我們要求的是 5 的階乘

遞歸和漢諾塔

漢諾塔:漢諾塔(又稱河內(nèi)塔)問題是源于印度一個古老傳說的益智玩具。大梵天創(chuàng)造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

如果是這樣的漢諾塔,我覺得應(yīng)該每個人都覺得很簡單吧,只需要三步就可以完成移動。

1、把小圓盤放到第三根柱子上

2、把中圓盤放到第二根柱子上

3、把小圓盤放到第二根柱子上

4、把大圓盤放到第三根柱子上

5、把小圓盤放到第一根柱子上

6、把中圓盤放到第三根柱子上

7、把小圓盤放到第三根柱子上

如圖所示

剖析我們上面是細分的方法,移動的核心思想分為三步。

1、把第一個柱子上的n-1圓盤移動到第二個柱子上。

2、把第一個柱子的第n個圓盤移動到第三個柱子上。

3、把第二個柱子的n-1個圓盤移動到第三個柱子。

所以遞歸就出現(xiàn)了

1、把第一個柱子上的n-1圓盤移動到第二個柱子上「遞歸實現(xiàn)」。

2、把第一個柱子的第n個圓盤移動到第三個柱子上。

3、把第二個柱子的n-1個圓盤移動到第三個柱子「遞歸實現(xiàn)」。

C語言代碼實現(xiàn)

#include <stdio.h>
#include <windows.h>
void Hanoi(int n, char a,char b,char c);
void Move(int n, char a, char b);
int count;
int main()
{
 int n=8;
 printf("漢諾塔的層數(shù):\n");
 scanf(" %d",&n);
 Hanoi(n, 'A', 'B', 'C');
 printf("Exiting main...\n");
 return 0;
}
void Hanoi(int n, char a, char b, char c)
{
 if (n == 1)
 {
  Move(n, a, c);
 }
 else
 {
  Hanoi(n - 1, a, c, b);/*把 n-1 從 a 柱子放到 b 柱子上面*/
  Move(n, a, c);  /*把 n 從 a 移動到 c 上*/
  Hanoi(n - 1, b, a, c);/*把n - 1 通過 a 的輔助作用 從 b 移動到 c 上*/
 }
}
void Move(int n, char a, char b)
{
 count++;
 printf("第%d次移動 Move %d: 從 %c 位置 移動到 %c !\n",count,n,a,b);
}

輸出如圖所示

加強版修改

加強了下軟件寫法,好好看代碼,寫的有點太快,沒細想,后面再完善。

#include <stdio.h>

/*柔性數(shù)組*/
typedef struct _soft_array{
 int len;
 int array[];
}soft_array;

/*漢諾塔結(jié)構(gòu)體*/
typedef struct _hannuo{
 soft_array *p_data;
 char name;
}hannuo;

hannuo * han_a = NULL;
hannuo * han_b = NULL;
hannuo * han_c = NULL;

void hannoiii(int n,hannuo * a,hannuo * b,hannuo * c);
void moveiii (int n,hannuo * a,hannuo * c);

int total;

void printf_han_data(hannuo * han)
{
 int i = 0;
 printf("%c: ",han->name);
 /*輸出漢諾塔的數(shù)據(jù)*/
 for(i = 0;i<han->p_data->len;i++)
 {
 printf("%d-",han->p_data->array[i]);
 }
 printf("\n"); 
}


int main()
{
 int i = 0;
 int n = 0;

 scanf(" %d",&n);
 total = n;
 /*定義三個漢諾塔節(jié)點*/
 han_a = (hannuo *)malloc(sizeof(hannuo));
 han_a->name = 'A';
 han_a->p_data = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);
 han_a->p_data->len = n;
 
 /*數(shù)據(jù)原來在第一根柱子上*/
 for(i = 0;i<n;i++)
 {
 han_a->p_data->array[i] = i+1;
 }
 printf_han_data(han_a);
 
 /*初始化第二根柱子*/
 han_b = (hannuo *)malloc(sizeof(hannuo));
 han_b->name = 'B';
 han_b->p_data = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);
 memset(han_b->p_data,0,sizeof(soft_array)+sizeof(int)*n);
 han_b->p_data->len = n;
 printf_han_data(han_b);
 /*初始化第三根柱子*/
 han_c = (hannuo *)malloc(sizeof(hannuo));
 han_c->name = 'C';
 han_c->p_data = (soft_array*)malloc(sizeof(soft_array)+sizeof(int)*n);
 memset(han_c->p_data,0,sizeof(soft_array)+sizeof(int)*n);
 han_c->p_data->len = n;
 printf_han_data(han_c);
 printf("------------------------\n");
 hannoiii(n,han_a,han_b,han_c);
 

 printf("\n");
 return 0;
}

void hannoiii(int n,hannuo * a,hannuo * b,hannuo * c)
{
 if(n == 1)
 {
 a->p_data->array[0] = 0;
 c->p_data->array[0] = 1;
 printf_han_data(han_a);
 printf_han_data(han_b);
 printf_han_data(han_c);
 printf("------------------------\n");
 }
 else
 {
 hannoiii(n - 1, a, c, b);/*把 n-1 從 a 柱子放到 b 柱子上面*/
  moveiii(n, a, c);  /*把 n 從 a 移動到 c 上*/
 printf_han_data(han_a);
 printf_han_data(han_b);
 printf_han_data(han_c);
 printf("------------------------\n");
  hannoiii(n - 1, b, a, c);/*把n - 1 通過 a 的輔助作用 從 b 移動到 c 上*/
 }
}

void moveiii (int n,hannuo * a,hannuo * c)
{
 int i = 0;
 int tmp = a->p_data->array[n-1];
 a->p_data->array[n-1] = 0;
 #if 1
 c->p_data->array[n-1] = tmp;
 #else
 for(i = 0;i < total;i++)
 {
  if(c->p_data->array[i] == 0){
   c->p_data->array[i] = tmp;
   break;
  }
 }
 #endif
}

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

相關(guān)文章

  • C++ 風靡一時的連連看游戲的實現(xiàn)流程詳解

    C++ 風靡一時的連連看游戲的實現(xiàn)流程詳解

    游戲“連連看”是源自臺灣的桌面小游戲,自從流入大陸以來風靡一時,也吸引眾多程序員開發(fā)出多種版本的“連連看”。這其中,顧芳編寫的“阿達連連看”以其精良的制作廣受好評,這也成為顧方“阿達系列軟件”的核心產(chǎn)品。并于2004年,取得國家版權(quán)局的計算機軟件登記證書
    2021-11-11
  • C語言malloc分配問題詳解

    C語言malloc分配問題詳解

    這篇文章主要介紹了c語言 malloc函數(shù)的分配問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-09-09
  • C語言中二級指針解析(指向指針的指針)

    C語言中二級指針解析(指向指針的指針)

    這篇文章主要介紹了C語言中二級指針(指向指針的指針),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Qt實現(xiàn)簡易毛玻璃效果的示例代碼

    Qt實現(xiàn)簡易毛玻璃效果的示例代碼

    這篇文章主要介紹了Qt如何利用模糊功能實現(xiàn)簡易的毛玻璃效果,并且鼠標可以移動無邊框窗口,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06
  • 使用OpenGL繪制Bezier曲線

    使用OpenGL繪制Bezier曲線

    這篇文章主要為大家詳細介紹了使用OpenGL繪制Bezier曲線的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 一波C語言字符數(shù)組實用技巧集錦

    一波C語言字符數(shù)組實用技巧集錦

    這篇文章主要介紹了一波C語言字符數(shù)組實用技巧集錦,包括許多字符的轉(zhuǎn)換與提取等基本操作示例,需要的朋友可以參考下
    2016-04-04
  • C語言代碼實現(xiàn)簡單2048游戲

    C語言代碼實現(xiàn)簡單2048游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)2048游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++實現(xiàn)LeetCode(79.詞語搜索)

    C++實現(xiàn)LeetCode(79.詞語搜索)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(79.詞語搜索),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談VS中添加頭文件時顯示無法找到文件的問題

    淺談VS中添加頭文件時顯示無法找到文件的問題

    下面小編就為大家?guī)硪黄獪\談VS中添加頭文件時顯示無法找到文件的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C/C++ 讀取16進制文件的方法

    C/C++ 讀取16進制文件的方法

    下面小編就為大家?guī)硪黄狢/C++ 讀取16進制文件的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論