菜鸡日记_C语言学习之函数_2

前言

​ 本菜鸡开始了学习C语言的旅途。用这个来记录一下上课所学到的一些东西。仅作为自己的一个学习笔记。里面的内容也只是我对学到的东西的一些理解,可能有很多错误,大佬们勿喷。如果发现我理解的有哪些错误,欢迎评论区指出,希望大佬们不吝赐教。




递归函数

自己调用自己,感觉和循环差不多。但是有些问题递归更好理解,循环不太好理解。但是递归需要的空间更多。因为每次调用自己都要开辟一块新的空间。



什么情况下可以用递归?

​ 解决问题的思路,转化为问题本身类似的问题时, 可以采用递归

​ 是不是所有的递归问题,c语言都支持呢? 不是的

​ c语言支持的递归,要满足以下条件:

​ 1):问题本身可以用递归解决

​ 2):递归不能无限递归!!!!要有结束条件

​ 递归到一定程度的时候,一定要有跳出递归的条件

​ 递归 ---- 递(往下走) ---- 归(往上走)

​ c语言是通过什么机制来支持递归呢?

​ 函数栈 栈空间:先进后出





小练习

1.写一个函数通过递归求n!

#include<stdio.h>
int factorial(int x);
int main()
{	
	int a;
	printf("请输入一个整数:\n");
	scanf("%d",&a);
	printf("%d!=%d",a,factorial(a));
	return 0;
}
int factorial(int x)
{
	if(x==0||x==1)
	{
		return 1;
	}
	else
	{
		return (factorial(x-1)*x);                             //
	}
}

2.写一个函数,求出如下问题

​ 有十级阶梯,一次可以上一级或者两级,试问上十级有多少种?

思路:踏上第十级阶梯的时候可以从第8阶或者第9阶踏上去。所以可以转换成f(10)=f(9)+f(8);那么同理f(9)=f(8)+f(7);…

所以找到了一个规律f(n)=f(n-1)+f(n-2);然后f(1)=1;f(2)=2我们是能够很容易得出的。所以这个问题就可以用递归解决了。

#include<stdio.h>
int step(int x); 
int main()
{
	while(1)
	{
		int n;
		printf("请输入楼梯阶数\n");
		scanf("%d",&n);
		printf("%d级楼梯有 %d 种走法\n\n",n,step(n));
	}
	return 0;		
}
int step(int x)
{
	if(x<=1)
	return 1;
	return (step(x-1)+step(x-2));
}

3.求水洼数

​ 小明家的前面有一块空地,空地不平,下雨后,就会有水洼

​ 输入M=5 N=5

​ 1, 0, 1, 0, 1

​ 1, 1, 1, 0, 1

​ 0, 0, 0, 1, 1

​ 0, 1, 1, 1, 0

​ 1, 0, 0, 0, 1

​ 1表示有水1,0表示没有水

​ 一个点的水,会和周围(上下左右)其他点的水连成一个大水洼(1个)

​ 上述示例中,有4个水洼

思路:如果这个位置上有水,就把这个位置变成0,然后再判断这个位置的旁边有没有水,如果有,就进入,将它变成0,,再判断旁边。直到旁边没有水为止。

#include<stdio.h>
void  charco(int a[][5],int x,int y);

int main()
{	int i,j;
	int flag=0;
	int a[5][5]={
	 {1,0,1,0,1},
	 {1,1,1,0,1},
	 {0,0,0,1,1},
	 {0,1,1,1,0},
	 {1,0,0,0,1}};
	 for(i=0;i<5;i++)
	 {
	 	for(j=0;j<5;j++)
	 	{
	 		if(a[i][j]==1)
	 		{
			 a[i][j]=0;
	 		charco(a,i,j);
			 flag++;	
			 }
		 }
	 }
	 printf("该数组有%d个水洼\n ",flag);
	return 0;
}
void charco(int a[][5],int x,int y)
{
	if(a[x-1][y]==1&&x>=1)
 {
 	a[x-1][y]=0;
  (charco(a,x-1,y));	
 }
 if(a[x][y+1]==1&&y<4)
 {
 	a[x][y+1]=0;
  (charco(a,x,y+1));	
 }
 if(a[x+1][y]==1&&x<4)
 {
 	a[x+1][y]=0;
 	 (charco(a,x+1,y));
 }
  if(a[x][y-1]==1&&y>=1)
 {
 	a[x][y-1]=0;
 	(charco(a,x,y-1));	
 }
}





今日发现的一些问题

1.当把数组传给函数的时候,传的是数组首地址,所以函数和main函数用的是同一个数组。在函数里面改变数组的值也会改变主函数里面数组的值。(传给函数的参数是一个地址,函数通过这个地址就能进入数组,也能够修改里面的东西)。

2.如果定义的是一个全局变量,函数也能够进行修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值