函数二--递归
函数二
C语言不兼容c++,c++兼容C语言
一、函数的作用
函数是用来封装一段代码,来表示一个功能
指针函数:
是函数,只要函数的返回值是指针,那么这个函数就叫指针函数
函数指针:
是指针,用来指向函数的
定义:
函数的返回值类型 (*函数指针名)(函数的参数列表)
void fun()
{
printf("wdd");
}
int* (*func)(int a,int b)=fun
回调函数:
把函数当做参数传给函数
#include<stdio.h>
typedef int (*pfunc)(int a,int b);
int add(int a, int b);
int func(int(*pfunc)(int a, int b), int v1, int v2);
//可以换成
int func(pfunc Pfunc ,int v1,int v2);
int sub(int a, int b);
int main()
{
printf("%d\n", func(add,1, 2));
printf("%d\n", func(sub,1, 2));
return 0;
}
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
//可以换成
int func(pfunc Pfunc,int v1,int v2)
{
return Pfunc(v1,v2);
}
int func(int(*pfunc)(int a, int b), int v1, int v2)
{
return pfunc(v1, v2);
}
二、函数的递归
最关键就是找规律,就是和前面一项或者几项的关系
错误示例
void func()
{
printf("666\n");
func()
}
int main()
{
func()
}
1.函数的递归,必须要有退出条件,不能永久递归
2.有两个过程,一个是在函数调用的时候去的过程(递去),当执行到递归结束的时候就会与一个回来的过程(归来)
void stu(int a)
{
if (a > 0)
{
stu(a - 1);
}
printf("666\n");
}
int main()
{
stu(5);
return 0;
//输出6行666
}
递去,归来:
void stu(int a)
{
if (a > 0)
{
stu(a - 1);
}
//printf("666\n");
printf("%d\n", a);
}
int main()
{
stu(5);
return 0;
}
/*输出的结果是
0 1 2 3 4 5
因为要先递去,就是说先执行if语句,在归来,执行printf语句
就是开始是没有执行printf语句的
*/
//如果把printf语句写在if语句上面结果就是5 4 3 2 1 0
void stu(int a)
{
if(a>0)
{
stu(a-1);
printf("%d\n",a);
}
}//结果是1 2 3 4 5
从1加到100,或者更多
int rec(int num)
{
if (num == 1)
{
return 1;
}
else
{
return num + rec(num - 1);
}
}
int main()
{
int sub=rec(100);
printf("%d\n",sub);
return 0;
}
//通过循环实现
int num = 0;
for (int i = 1; i <= 100; i++)
{
num += i;
}
printf("%d", num);
斐波拉契数列递归:
int stu1(int num)
{
if (num == 1||num==2)
{
return 1;
}
else
{
return stu1(num - 1) + stu1(num - 2);
}
}
int main()
{
int num;
int num1 = 0;
scanf_s("%d", &num);
//printf("%d\n", stu1(6));
for (int i = 1; i <= num; i++)
{
num1 += stu1(i);
printf("%2d", stu1(i));
}
printf("\n");
printf("%d\n", num1);
//可以看每一项的值,也可以算所有项相加的值
}
猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第 10 天早上想再吃时,发现只剩下一个桃子了。
编写程序求猴子第一天摘了多少个桃子。
int stu2(int day)
{
if (day == 10)
{
return 1;
}
else
{
return (stu2(day + 1) + 1) * 2;
}
}
int main()
{
printf("%d",stu2(1));
}//答案是1534