bilibiliclass10and11_函式遞迴
函式遞迴
思考方式:使大事化小,減少程式碼量
寫遞迴之前的思想方式,將函式複製多次,按一個一個順序進行
例題一:最簡單的遞迴:
#include<stdio.h>
int main()
{
printf("hehe\n");
main();
return 0;
}
//遞迴常見的錯誤:stack overflow
記憶體分為棧區(區域性變數,函式形參,函式呼叫),堆區(動態開闢的記憶體,malloc,calloc),靜態區(全域性變數,stacic修飾的變數)
呼叫一次main函式就會佔用棧區
https://stackoverflow.com/程式設計師知乎
例題二:輸入1234 列印1 2 3 4
#include<stdio.h>
void print(int n)//1234
{
if(n>9)
{
print(n/10);
}
printf("%d ",n%10);
}
int main()
{
unsigned int num = 0;
scanf("%d",&num);
print(num);
}
遞迴兩個必要條件:
1.存在限制條件,當滿足這個限制條件後,遞迴不再繼續
2.每次遞迴,必須接近限制條件
例題三:strlen函式實現計算字串長度
#include<stdio.h>
#include<string.h>
int main()
{
char arr[]="bit";
int sum=strlen(arr);
printf("len=%d\n",sum);
}
自己實現strlen函式
#include<stdio.h>
//#include<string.h>
int self_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "bit";
// int sum = strlen(arr);
int sum = self_strlen(arr);
printf("len=%d\n", sum);
return 0;
}
不能使用臨時變數(計數器),使用遞迴解決
//把大事化小
//self_strlen("bit");
//1+self_strlen("it");
//1+1+self_strlen("t");
//1+1+1+self_strlen("");
//1+1+1+0
//3
#include<stdio.h>
int self_strlen(char* str)
{
if(*str!='\0')
return 1+self_strlen(str+1);//b的地址+1==>i的地址
else
return 0;
}
int main()
{
char arr[] = "bit";
int sum = self_strlen(arr);
printf("len=%d\n", sum);
return 0;
}
遞迴與迭代(迴圈)
例題四:求n的階乘
#include<stdio.h>
int Fac1(int n)
{
int i=0;
int ret =1;
for (i=1;i<=n;i++)
{
ret*=i;
}
return ret;
}
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret=Fac1(n);
printf("%d\n",ret);
return 0;
}
用遞迴解決
#include<stdio.h>
int Fac2(int n)
{
if(n<=1)
return 1;
else
return n*Fac2(n-1);
}
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret=Fac2(n);
printf("%d\n",ret);
return 0;
}
例題五:遞迴求第n個斐波那契數
#include<stdio.h>
int Fib(int n)
{
if(n<=2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
//TDD-測試驅動開發:先寫主函式,後寫其他函式
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret=Fib(n);
printf("%d\n",ret);
return 0;
}
//50
//49 48
//48 47 47 46
//47 46 46 45 46 45 45 44
//...............
//重複次數過多
迭代求第n個斐波那契數
#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;
}
//1 1 2 3 5 8 13 21 34 55. . . . . .
//a b c
// a b c
//TDD-測試驅動開發:先寫主函式,後寫其他函式
int main()
{
int n=0;
int ret=0;
scanf("%d",&n);
ret=Fib(n);
printf("%d\n",ret);
return 0;
}
遞迴經典問題:
1.漢諾塔問題:ABC三柱 A->C//廣聯達面試題
2.青蛙跳臺階:青蛙一次可以跳1個或者2個臺階
跳n個臺階 斐波那契問題//《劍指offer》52道面試題
C語言小知識
分模組寫程式碼
add.h
//防止一個標頭檔案被引用多次
#ifndef __ADD_H__
#define __ADD_H__
//函式的宣告
int Add(int x,int y);
#endif
add.c
int Add(int x,int y)
{
int sum=x+y;
return sum;
}
test.c
#include"add.h"
相關文章
- 遞迴函式遞迴函式
- 函式表示式–遞迴函式遞迴
- 函式的遞迴函式遞迴
- 函式之遞迴函式遞迴
- Python 函式進階-遞迴函式Python函式遞迴
- 函式遞迴與生成式函式遞迴
- 1.5.6 python遞迴函式Python遞迴函式
- 13.0、python遞迴函式Python遞迴函式
- 遞迴函式的理解遞迴函式
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- day 17 – 1 遞迴函式遞迴函式
- 遞迴函式-樹形列表遞迴函式
- 遞迴函式例項大全遞迴函式
- 初學 PHP 函式的遞迴PHP函式遞迴
- GO語言————6.6 遞迴函式Go遞迴函式
- [20180531]函式呼叫與遞迴.txt函式遞迴
- C#語言函式遞迴C#函式遞迴
- 遞迴函式,可變引數列表遞迴函式
- 測開之函式進階· 第1篇《遞迴函式》函式遞迴
- 課時22:函式:遞迴是神馬函式遞迴
- 假如我們把函式都改成遞迴...函式遞迴
- 編寫函式:遞迴求逆序 (Append Code) ★函式遞迴APP
- (011)我們一起學Python;匿名函式,遞迴函式Python函式遞迴
- 遞迴、三元表示式、生成式(列表,字典)、匿名函式遞迴函式
- 『無為則無心』Python函式 — 32、遞迴Python函式遞迴
- Python3之遞迴函式簡單示例Python遞迴函式
- 好程式設計師Python教程系列遞迴函式與匿名函式呼叫程式設計師Python遞迴函式
- 遞迴匿名函式手動實現 http_build_query 系統函式遞迴函式HTTPUI
- 遞迴函式原理 技能包瞭解一下遞迴函式
- 遞迴示例-展開編號(Excel函式集團)遞迴Excel函式
- 從漢諾塔遊戲理解python遞迴函式遊戲Python遞迴函式
- 函式的遞迴及科赫曲線繪製函式遞迴
- 20201023_081.遞迴函式_函式呼叫記憶體分析_棧幀的建立遞迴函式記憶體
- 傳遞函式函式
- Python遞迴函式,二分查詢演算法Python遞迴函式演算法
- 好程式設計師Python培訓分享Python的遞迴函式與匿名函式呼叫程式設計師Python遞迴函式
- web前端教程之JavaScript學習筆記之遞迴函式Web前端JavaScript筆記遞迴函式