函数-函数递归及练习

这篇具有很好参考价值的文章主要介绍了函数-函数递归及练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、什么是递归?

2、递归的两个必要条件

3、递归的练习 

3.1 接受一个整型值(无符号),按照顺序打印它的每一位

3.2 编写函数不允许创建临时变量,求字符串的长度 

3.3 求第n个斐波那契数

3.4 字符串逆序(递归实现) 

总结


1、什么是递归?

程序调用自身的编程技巧称为递归( recursion )。
递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小

2、递归的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件。

3、递归的练习 


3.1 接受一个整型值(无符号),按照顺序打印它的每一位

例如:

输入: 1234 ,输出 1 2 3 4.

使用递归的方法代码如下:  

#include <stdio.h>
void print(int n)
{
     if(n>9)
     {
         print(n/10);
     }
     printf("%d ", n%10);
}    
int main()
{
     int num = 1234;
     print(num);
     return 0;
}

其递归过程如下: 

函数-函数递归及练习 

3.2 编写函数不允许创建临时变量,求字符串的长度 

 递归代码如下:

#include<stdio.h>
int my_strlen(char* s)
{
	if (*s == '\0')
	{
		return 0;
	}
	return 1 + my_strlen(s + 1);
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

3.3 求第n个斐波那契数

递归代码如下: 

#include<stdio.h>
int Fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return Fib(n - 1) + Fib(n - 2);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}
但是我们会发现 有问题:使用 Fib 这个函数的时候如果我们要计算第 50 个斐波那契数字的时候特别耗费时间。
为什么呢?因为 F ib 函数在调用的过程中有很多计算其实在一直重复。我们可以用迭代这样来写。

代码如下:

#include<stdio.h>
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}

3.4 字符串逆序(递归实现) 

编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。

要求:不能使用C函数库中的字符串操作函数。

比如有 char arr[] = "abcdef",逆序之后数组的内容变成:fedcba。

递归代码如下:

#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
	int len = strlen(str);
	char temp = *str;
    *str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (strlen(str + 1) >= 2)
	{
		reverse_string(str + 1);
	}
	*(str + len - 1) = temp;
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

也可以用循环的方式来实现,其思路为:

  1. 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置  
  2. 交换两个指针位置上的字符  
  3. left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束

函数部分代码如下:文章来源地址https://www.toymoban.com/news/detail-432356.html

void reverse_string(char* arr)
{
	char *left = arr;
	char *right = arr+strlen(arr)-1;
	while(left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

总结

  1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
  2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
  3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销

到了这里,关于函数-函数递归及练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode算法递归类—合并两个有序链表

    目录 21. 合并两个有序链表 题解: 代码: 将两个升序链表合并为一个新的  升序  链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例 1: 示例 2: 示例 3: 提示: 两个链表的节点数目范围是  [0, 50] -100 = Node.val = 100 l1  和  l2  均按  非递减顺序  

    2024年02月13日
    浏览(39)
  • 递归的练习

    思路 1.确定能否使用递归求解 2.推到出递推关系,即父问题与子问题的关系,以及递归的结束条件 深入到最里层的叫做递 从最里层出来的叫做归 在递的过程中,外层函数内的局部变量(以及方法参数)并未消失,归的时候还可以用到 阶乘 打印字符串 二分查找 冒泡排序

    2024年02月07日
    浏览(28)
  • 迷路的机器人(递归回溯+动态规划两个方法实现)

    题目: 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。 示例: 输入: [   [0,0,0],   [0,1,0],   [0,0,0] ] 输出: [[0,0],[0,1],[0,2],[1,2],[2,2]] 解

    2024年02月12日
    浏览(37)
  • 递归回溯两个例题:1.数组组合 2.在矩阵中搜索单词

    题目1:组合 给定两个整数 n 和 k ,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入:n = 4, k = 2 输出: [   [2,4],   [3,4],   [2,3],   [1,2],   [1,3],   [1,4], ]  解题思路: 1.定义一个temp数组,存放临时的组合结果 2.两种选择:1.选择当前元素2.不选

    2024年02月15日
    浏览(43)
  • java 遍历目录 树 递归 控制深度 层数

    在查询数据库树结构或者目录时,通常需要控制深度,或者到第几层。 count为2时, files.listFiles()拿到的是a1,a2。 从a1进入到下一层函数,把1传进去了。files.listFiles()拿到的是b1,这里的count是1。 从a2进入到下一层函数,也是把1传进去了。files.listFiles()拿到的是b2,这里的coun

    2024年02月12日
    浏览(76)
  • 如何使用递归 Grep 命令在目录中搜索?

    在 Linux 系统中, grep 是一个强大的文本搜索工具,可以用于在文件中查找指定的文本模式。当需要在目录及其子目录中搜索特定的文本时,可以使用递归 grep 命令来快速定位目标文件。本文将详细介绍如何使用递归 grep 命令来搜索目录中的文件。 递归 grep 命令的语法如下:

    2024年02月07日
    浏览(54)
  • C练习——递归求第n个人年龄

    题目: 有n个人坐在一起,第n个人比第n-1个人大2岁,第n-1个人比第n-2个人大2岁,以此类推,……,第1个人是10岁。请问第n个人年龄多大? 解析: 简单循环也能求解 但按题意要求递归求解 age(n) = { 10                    当n=1                { age(n-1)+2     当n1 逻辑:

    2024年02月01日
    浏览(45)
  • 【C语言练习——合并两个有序序列】

    第一行包含两个正整数n, m,用空格分隔; n表示第二行第一个升序序列中数字的个数; m表示第三行第二个升序序列中数字的个数 第二行包含n个整数,用空格分隔 第三行包含m个整数,用空格分隔 输出描述: 输出为一行,输出长度为n+m的升序序列 即长度为n的升序序列和长度

    2024年02月02日
    浏览(46)
  • 【JAVA】方法的使用:方法语法、方法调用、方法重载、递归练习

    🍉内容专栏:【JAVA从0到入门】 🍉本文脉络:JAVA方法的使用,递归练习 🍉本文作者:Melon_西西 🍉发布时间 :2023.7.19 目录 1. 什么是方法(method) 2 方法定义 2.1 方法定义语法格式  例子:两个数相加 例子:判断某一年是否为闰年并调用判断函数  2.2 方法定义注意事项 3 方法

    2024年02月14日
    浏览(46)
  • 【算法】递归、回溯、剪枝、dfs 算法题练习(组合、排列、总和问题;C++)

    后面的练习是接着下面链接中的文章所继续的,在对后面的题练习之前,可以先将下面的的文章进行了解👇: 【算法】{画决策树 + dfs + 递归 + 回溯 + 剪枝} 解决排列、子集问题(C++) 思路 题意分析 :要求根据给出的数字,算出合法的括号组成个数。根据题目,我们可以总

    2024年02月22日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包