函数二--递归

函数二

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
posted @ 2020-12-08 17:16  kisfly  阅读(57)  评论(0编辑  收藏  举报