bilibiliclass10and11_函式遞迴

神蹟小卒發表於2020-11-21

函式遞迴

思考方式:使大事化小,減少程式碼量
寫遞迴之前的思想方式,將函式複製多次,按一個一個順序進行

例題一:最簡單的遞迴:

#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"

相關文章