精华内容
下载资源
问答
  • C语言 函数递归例题解析

    万次阅读 多人点赞 2018-05-08 14:37:44
    1.接受一个整形值(无符号),把它转换为 字符并打印它 ...递归实现问题在处理较大数据时,由于无限次调用自己容易导致栈溢出,所以它的效率会比迭代法低 迭代是更新变量的旧值。递归是在函数内部调用自身

    1.接受一个整形值(无符号),把它转换为 字符并打印它

    void fun(int x)
    {
        if (x > 9)
        {
            fun(x/10);
        }
    
        printf("%d\n", x%10);
    
    }
    int main()
    {
        int a = 1234;
        fun(a);
        system("pause");
        return 0;
    }

    我们来看一下递归的过程
    这里写图片描述

    这里写图片描述

    这里写图片描述

    这时我们是不是可以理解了输出的结果

    模拟实现strlen()函数。

    int my_strlen(char *str)
    {
        if (*str == '\0')
        {
            return 0;
        }
        else
        {
            return 1 + my_strlen(str+1);
            //return 1 + my_strlen(str++);//str++的副作用,每次传过去的都是str
        }
    
    }
    int main()
    {
        char str1[] = "abcdefghijklmnopqrstuvwxyz";
        printf("%d", my_strlen(str1));
    
        system("pause");
        return 0;
    
    }

    我们来看一下这个函数

    int my_strlen(char *str)
    {
        if (*str == '\0')
                return 0;
        else
            return 1 + my_strlen(str+1);
    }

    这里写图片描述

    递归很好用,但是要多多练习理解调用的过程

    3.求n的阶乘

    int factorial(int x)
    {
        if (x <= 1)
            return 1;
        else
            return x* factorial(x - 1);
    }
    int main()
    {
        int x = 5;
        factorial(x);
        system("pause");
        return 0;
    }

    4.斐波那契数列

    int fib(int x)
    {
        if (x <= 2)
            return 1;
        else
            return fib(x - 1) + fib(x - 2);
    }
    int main()
    {
        int x = 4;
        printf("%d",fib(x));
        system("pause");
        return 0;
    }

    栈溢出(死递归):系统分配给程序的栈空间是有限的,在死循环和死递归的情况下,一直在开辟栈空间,最终导致栈空间耗尽。

    总结

    • 很多问题用递归解决比非递归解决更清楚,也更容易实现
    • 递归实现问题在处理较大数据时,由于无限次调用自己容易导致栈溢出,所以它的效率会比迭代法低
    • 迭代是更新变量的旧值。递归是在函数内部调用自身
    展开全文
  • 关于C语言递归函数的心得及一些例题 递归,是一种函数调用,简单来说,函数内容无非就是两部分,第一部分是出口,另一部分则是循环调用的语句。下面,可以通过具体的函数来理解什么是递归。 1.阶乘: double fact...

    关于C语言递归函数的心得及一些例题

    递归,是一种函数调用,简单来说,函数内容无非就是两部分,第一部分是出口,另一部分则是循环调用的语句。下面,可以通过具体的函数来理解什么是递归。
    1.阶乘:

    double fact(int n) {
    	if (n == 1 || n == 0)
    		return 1;
    	else return(n * fact(n - 1));
    }
    

    2.指数函数:

    /*x是底数,n是指数*/
    double calc_pow(double x, int n) {
    	if (n == 1)
    		return x;
    	else return (x * calc_pow(x, n - 1));
    }
    

    3.Fabonacci数列:

    /*f返回第n个斐波那契数列*/
    int f(int n) {
    	int sum;
    	if (n == 0) {
    		sum = 0;
    	}
    	else if (n == 1) {
    		sum = 1;
    	}
    	else {
    		sum = f(n - 2) + f(n - 1);
    	}
    	return sum;
    }
    

    4.顺序输出整数:

    void printdigits(int n) {
    	if (n < 10) {//出口
    		printf("%d\n", n);
    	}
    	else {
    		printdigits(n / 10);//12345-1234-123-12-1-12%10-123%10-1234%10-12345%10
    		printf("%d\n", n % 10);
    	}
    }
    

    5.十进制换二进制:

    void dectobin(int n) {
    	if (n == 0) {
    		printf("0");
    	}
    	else if (n == 1) {
    		printf("1");
    	}
    	else {
    		dectobin(n / 2);//10-5-2-1  1-1 2-0 5-1 10-0
    		printf("%d", n % 2);
    	}
    }
    
    展开全文
  • 一、基本内容:C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。要点:1、C语言函数可以递归调用。2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。二、递归条件采用...

    一、基本内容:

    C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。

    要点:

    1、C语言函数可以递归调用。

    2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。

    二、递归条件

    采用递归方法来解决问题,必须符合以下三个条件:

    1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。

    说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。

    2、可以应用这个转化过程使问题得到解决。

    说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题。

    3、必定要有一个明确的结束递归的条件。

    说明:一定要能够在适当的地方结束递归调用。不然可能导致系统崩溃。

    三、递归实例

    例:使用递归的方法求n!

    当n>1时,求n!的问题可以转化为n*(n-1)!的新问题。

    比如n=5:

    第一部分:5*4*3*2*1 n*(n-1)!

    第二部分:4*3*2*1 (n-1)*(n-2)!

    第三部分:3*2*1 (n-2)(n-3)!

    第四部分:2*1 (n-3)(n-4)!

    第五部分:1 (n-5)! 5-5=0,得到值1,结束递归。

    源程序:

    代码如下:

    fac(int n)

    {int t;

    if(n==1)||(n==0) return 1;

    else

    { t=n*fac(n-1);

    return t;

    }

    }

    main( )

    {int m,y;

    printf(“Enter m:”);

    scanf(“%d”,&m);

    if(m1)

    按公式可编程如下:

    long ff(int n)

    {

    long f;

    if(n

    展开全文
  • C语言递归

    2021-04-24 19:14:55
    递归啊~递归

    在C语言的学习过程中,我们时常遇到一些特殊的问题,这些问题一步一步解决,且这些步骤都是这个问题的上一步或下一步(语文不好,不太会形容,555),这时候,我们就可以使用递归。
    递归其实就是函数自己调用自己链表的问题与一些树的问题常用它来解决。著名的深度优先搜索(DFS)就可以通过递归实现。
    接下来给出几个简单例题帮助大家理解:

    例1:非常经典的斐波那契数

    #include <stdio.h>
    int fibonacci(int n)
    {
    	if(n <= 2) {
    		return 1;//第一、二个都是1。
    	} else {
    	    return fibonacci(n - 1) + fibonacci(n - 2);
        }//每个斐波那契数是它前两个的和,用递归来实现。
    }
    int main(void) {
    	int n;
    	printf("请输入你想输出第几项的斐波那契数:\n");
    	scanf("%d", &n);
    	printf("%d\n", fibonacci(n));
    	return 0;
    }
    

    例2:非常简单的一道二叉树题目

    在这里插入图片描述

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    int maxDepth(struct TreeNode *root) {
        if (root == NULL) return 0;
        return fmax(maxDepth(root->left), maxDepth(root->right)) + 1;
    }//每个结点的高度是它下面两个高度的最大值再加一,用递归实现。
    

    例3:又是一道二叉树的题:

    在这里插入图片描述
    在这里插入图片描述

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    bool hasPathSum(struct TreeNode *root, int sum) {
        if (root == NULL) {
            return false;
        }//没有路,返回false。
        if (root->left == NULL && root->right == NULL) {
            return sum == root->val;
        }//接下来无路可走,从头走到结束了,如果总和等于target,则返回true,找到,否则返回false。
        return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
    }//最后递归,分别向左右两边找。
    

    例4:全排列问题(深度优先搜索)

    力扣46.全排列
    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    /**
     * Return an array of arrays of size *returnSize.
     * The sizes of the arrays are returned as *returnColumnSizes array.
     * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
     */
    int cnt;
    void dfs(int step, int* nums, int numsSize, int** ret, int* path, bool* book) {
    //step先从0开始
    	int i;
    	if (step == numsSize) {
    		//找到一种排列方式。
            ret[cnt] = (int*)malloc(sizeof(int) * numsSize);
            for(int i=0;i<numsSize;++i){
                ret[cnt][i]=path[i];
            }
            //放到答案的数组里
            cnt++;//计数器加1
    		return;
    	}
    	for (i = 0; i < numsSize; i++) {
            if (book[i]) {
                continue;
                //这个值被用过,找下一个。
            }
            //值没被用过,那这次就把它加上。
            path[step] = nums[i];
            book[i] = true;
            //这次用了这个值,接下来找下一个位置的。
            dfs(step + 1, nums, numsSize, ret, path, book);
            //注意step + 1
            book[i] = false;
            //递归到最后一步跳出来了,这个值相当于上一次用过了,下一次还要用,book归位,表示还未用,这步十分关键。
    	}
        return;
    }
    
    int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    	cnt = 0;//计数器最开始为0
        *returnSize = 1;
        for (i = 1; i <= numsSize; i++) {
            *returnSize *= i;
        }//数学方式计算应该有多少种全排列。
        *returnColumnSizes = (int*)malloc(sizeof(int) * (*returnSize));
        for (int i = 0; i < (*returnSize); i++) {
            (*returnColumnSizes)[i] = numsSize;
        }
        bool* book = (bool*)calloc(numsSize, sizeof(bool));
        //book用来判断一个值是否被用过。
    	int** ret = (int**)malloc(sizeof(int*)*(*returnSize));
        int* path = (int*)malloc(sizeof(int) * numsSize);
        //初始化一个路径数组用来记录每一次全排列。
    	dfs(0, nums, numsSize, ret, path, book);
        return ret;
    }
    
    展开全文
  • C语言入门:递归经典例题

    千次阅读 2018-12-14 21:34:47
    C语言入门:递归经典例题 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,...
  • C语言递归算法

    2021-06-06 23:18:30
    递归 所谓递归,存在传递也存在归还简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
  • C语言递归实现数组求和

    千次阅读 2019-11-14 23:25:57
    C语言递归实现数组求和 一.基本思想(分而治之): 1.基线条件: 显然最简单的情况:数组只有一个数时,无需任何操作,直接返回其值即可; 所以基线条件为数组长度为1; 2.递归条件: 每一次加上数组最后一位并缩短...
  • 函数的递归调用 ****在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 例如: int f(int x) { int y, z; z = f(y); return (2 * z); } 在调用函数f的过程中,又要调用f函数(本...
  • C语言递归示例详解

    2019-11-02 12:03:40
    一个函数在他的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用自身(也就是相当于嵌套函数),每一次的调用就进入新的一层函数,执行到最后结束的那一行代码就开始从里面一层一层的...
  • c语言 DFS算法 递归调用

    万次阅读 2018-03-27 17:04:27
    例题1:方格分割(第八届蓝桥杯省赛题目) 6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。 如图:p1.png, p2.png, p3.png 就是可行的分割法。 试计算: 包括这3种分法在内,一共有多少种...
  • C语言递归函数分析

    热门讨论 2021-04-27 09:41:53
    ##用递归的方法编写函数来求字符串的长度,即递归版本的strlen函数 例如 字符串:“HELLO”, s指针指向字符H,s+1指针指向ELLO字符串,那么只要计算出s+1子串的长度再进行加1,即字符H,连续递归调用自己,就可以...
  • 本篇将用经典例题----八皇后问题,来整理递归调用的思路。 首先明确,八皇后问题是什么? 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8...
  • C语言经典例题递归

    2020-11-09 17:00:27
    递归方式实现打印一个整数的每一位 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void print(int n) { if (n > 9) { print(n / 10); } printf("%d ", n % 10); } int main() { int num = ...
  • C语言函数的递归调用实例分析

    千次阅读 2017-10-19 20:03:13
     1、C语言函数可以递归调用。  2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。二、递归条件 采用递归方法来解决问题,必须符合以下三个条件:  1、可以把要解决的问题转化为一
  • 递归相关例题

    2020-12-19 17:30:49
    目录:例1:分别使用递归和非递归求n的阶乘方法一:递归方法二:非递归例2:分别使用递归和非递归实现strlen的模拟方法一:递归方法二:非递归例3:计算一个数的每位之和方法一:递归方法二:非递归4.编使用递归和非递归...
  • 本篇博客将从七道函数例题出发,讲述自己关于函数递归调用、如何控制运行时间的学习
  • 函数递归调用示例(教材习题5.3,运行结果012345) #include&lt;stdio.h&gt; void fun(int k); void main() {  int w=5;  fun(w); } void fun(int k) {  if(k&gt;0)  fun(k-1);  ...
  • } } 【3.34】下面函数用递归调用的方法,将str中存放的长度为n的字符串反转过来,例如原来是"ABCDE",反序为"EDCBA"。 void invent(char *str,int n) { char t; t=*str; *str=*(str+n-1); *(str+n-1)=t; if( n...
  • C语言经典例题(菜鸟教程100例)

    万次阅读 多人点赞 2018-09-04 18:47:59
    学习c语言基础,怎么能少了菜鸟教程上的100道例题呢,这里整理一下每道题的链接,希望大家能享受学习的乐趣 1,有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 2,企业发放的奖金根据...
  • 目录 问题描述 分析问题 解决问题 总结 问题描述 汉诺塔问题是一个...当n值增大时,只是复杂度发生了改变,实际上函数的递归调用还是一样的。慢慢来,说不定哪天自己理解透了呢~ 如有补充或存在问题请在评论区留言哟~
  • c语言函数调用及应用举例

    万次阅读 多人点赞 2019-04-20 16:27:29
    一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。 1.标准库函数: 分为:I/O函数,字符串,字符处理函数,数学函数,接口函数,时间转换和操作函数,动态...
  • 1.递归和非递归分别实现求第n个斐波那契数。 递归最重要的是写出n-1和n-2项,直到判断停止的位置。 非递归需要明确前几项的关系。 非递归 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<...
  • 而函数中,比较难的一个知识点就是函数的递归调用。 值得注意的是,函数的递归调用在现实工作并不是很常用,但是涉及到算法或者是学校的考试的话,那这个知识点就成了必考的内容。所以,骚年,躲是躲不掉滴~~ 好了...
  • 2.递归实现 3.结束递归的条件(deno&gt;100) 编码 #include &lt;stdio.h&gt; int main() { int sign = 1; double deno = 2.0, sum = 1.0,term; while (deno&lt;=100) { ...
  • 递归算法详解及经典例题C语言

    千次阅读 2019-02-11 11:54:16
    1.递归:在定义一个过程或者函数时出现调用本身或本函数的成分...尾递归是指递归调用语句只有一个而且是处于算法的末尾,例如我们即将提到的求解n!的算法就是尾递归算法。经过分析可知,当递归调用返回时,返回到上...
  • //递归法 /* ================================================================== 题目:F(x,1)=1  F(x,n)=F(2x+1,n-1)*x (n>1) ==================================================================
  • 问题描述: ... 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回   1+7+2+9,它的和是19 4 . 编写一个函数reverse_string(char ...
  • c语言中的递归思想是难点也是重点,C程序设计语言中设计到一些递归,对递归思想掌握的还是不够,把这两道例题记录下来,增强自己的理解。 正文 非递归形式的itoa和reverse代码 #include <stdio.h> #include &...
  • C语言——递归(一)

    2020-10-22 19:12:58
    (2)递归调用必须有一个结束的条件,否则递归调用就无法结束了; 例题: 一、递归求幂; 核心代码: if(m==0) return 1; y=power(x,m/2); y=y*y; if(m%2!=0) y=y*x 完整代码: #include<stdio.h> ...
  • 原标题:递归——强大的解决问题之道作者:董成荣 来源:牛客网递归什么是递归递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,774
精华内容 709
关键字:

c语言递归调用例题

c语言 订阅