zoukankan      html  css  js  c++  java
  • 函数二--递归

    函数二

    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
    ", func(add,1, 2));
    	printf("%d
    ", 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
    ");
        func()
    }
    int main()
    {
        func()
    }
    

    1.函数的递归,必须要有退出条件,不能永久递归

    2.有两个过程,一个是在函数调用的时候去的过程(递去),当执行到递归结束的时候就会与一个回来的过程(归来)

    void stu(int a)
    {
    	if (a > 0)
    	{
    		stu(a - 1);
    	}
    	printf("666
    ");
    }
    int main()
    {
        stu(5);
        return 0;
        //输出6行666
    }
    

    递去,归来:

    void stu(int a)
    {
    	if (a > 0)
    	{
    		stu(a - 1);
    	}
    	//printf("666
    ");
    	printf("%d
    ", 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
    ",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
    ",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
    ", stu1(6));
    	for (int i = 1; i <= num; i++)
    	{
    		num1 += stu1(i);
    		
    		printf("%2d", stu1(i));
    	}
    	printf("
    ");
    	printf("%d
    ", 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
    
  • 相关阅读:
    链接被点击时不出现虚线框的方法
    label 和 legend标签的用法
    了解常见的浏览器内核 Trident,Geckos,Presto,Webkit
    DOCTYPE声明的几种类型
    Angularjs基础教程
    理解angular中的module和injector,即依赖注入
    es5 api
    css3_note
    canvas 基础知识
    uglifyjs note
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/14103702.html
Copyright © 2011-2022 走看看