前言
本菜鸡开始了学习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.如果定义的是一个全局变量,函数也能够进行修改。