C语言入门(初学函数递归和数组时常见的错误)

加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

C语言入门(初学函数递归和数组时常见的错误)

函数的递归

初学函数递归方面的知识,总会感到很吃力,样例不太清晰,下面看一到难度适中的函数递归样例题

时间限制: 1 Sec  内存限制: 128 MB
提交: 369  解决: 693
[提交] [状态] [讨论版] [命题人:eilene]
题目描述
输入n和n个整数,以与输入顺序相反的顺序输出这n个整数。要求不使用数组,而使用递归函数实现。

递归函数实现过程如下:

void inverse(int n)

{

  if(n >1)

{

    (1) 读入一个整数,存入num;

    (2)  将后面的n-1个数逆序输出: inverse(n-1);  

    (3)  输出num;

}

if( n == 1)  直接输出num;   

}

输入
输入有两行,第一行是一个正整数n,第二行有n个整数,整数之间由空格隔开。
输出
输出n个整数,顺序与输入顺序相反,每个整数后有一个空格。
样例输入 Copy
5
11 22 33 44 55
样例输出 Copy
55 44 33 22 11

这道题是一个对inverse函数的递归调用,其实质是函数占据的内存空间,随着n的逐渐递减,{比如n=5时,存入5,执行下一步inverse(n-1),这是n-1的invers函数开始执行,在执行到n-2时,到n==1时,num输出,然后进行上一级即n=2,如此循环往复,直到把最初的第一级执行完毕。这就是一个完整的函数调用过程。}
题解


#include<stdio.h>
#include<stdlib.h>
void inverse(int n);
int main ()
{
    int n,a;
    scanf("%d",&n);
    inverse(n);
    return 0;
}
void inverse(int n)
{
    int num;
    if(n>1)
    {
        scanf("%d",&num);
        inverse(n-1);//执行完此行后,就开始一个新的函数
        printf("%d ",num);
    }
    else if(n==1)//即n=1时,开始输出,输出玩后inver(n-2)从输出开始执行
    {
        scanf("%d",&num);
        printf("%d ",num);
    }
}

这道题是一个很好的函数递归题,吃透这道题,对理解函数递归会有很大帮助。

接下来来看另外一道函数递归题

输入一个十进制整数n,输出对应的二进制整数。常用的转换方法为“除2取余,倒序排列”。将一个十进制数除以2,得到余数和商,将得到的商再除以2,依次类推,直到商等于0为止,倒取除得的余数,即为所求的二进制数。例如,把52换算成二进制数的计算过程如下图:

52除以2得到的余数依次为0,0,1,0,1,1,倒序排列,得到52对应的二进制数110100。

用递归的思想来描述上述计算过程是这样的:输出n/2对应的二进制数,然后输入%2。递归函数的实    现过程如下:

void convert(int n)

{

if(n > 0)

{ 

  调用自身,输出n/2对应的二进制数;

   输出n%2;

}

}

试试吧!

输入
输入一个正整数n。
输出
输出n对应的二进制数。
样例输入 Copy
52
样例输出 Copy
110100
解法如下
#include<stdio.h>
#include<stdlib.h>
void convert(int n);
int main ()
{
    int a;
    scanf("%d",&a);
    convert(a);
}
void convert(int n)
{
    if(n>0)
    {
        int b;
        convert(n/2);
        b=n%2;
        printf("%d",b);
    }
}

数组的常见错误和样例总结

数组输出时空格问题,这个问题其实可以在输出的循环中直接解决,只需要在输出的下面再加一个判断,判断所输出的数不是最后一个数,即如果输出n个数,就让他在小于n-1时输出一个空格,如此这个问题便得到了解决。
第二个问题四常见的插入一个数,记住一个最重要的顺序,先排列再查重,这点很关键,会为以后的步骤节省不少麻烦。
好了接下来看一个具体的题:

     1118: 有序数组的元素添加
      时间限制: 1 Sec  内存限制: 128 MB
提交: 919  解决: 930
[提交] [状态] [讨论版] [命题人:eilene]
     题目描述
       一个非递减有序的整型数组有n个元素,给定一个整数num,将num插入该序列的适当   位置,使序列仍保持非递减有序。
      要求定义一个函数insert(),将整数num插入在数组a的适当位置上,函数原型如下:

void insert(int a[], int n, int num);

另外函数仍然调用以前定义过的函数PrintArr()输出数组所有元素。
输入
输入有三行。第一行是一个正整数n,n<=1000。第二行是n个整数,第三行是待插入整数num。
输出
输出非递减有序的n+1个整数,数据之间用空格隔开。输出占一行。
样例输入 Copy
5
1 2 4 5 6
3
样例输出 Copy
1 2 3 4 5 6
提示
元素之间有空格,最后一个元素后面没有空格。

直接看题解

#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
void insert(int a[], int n, int num);
void PrintArr(int a[],int n);
int main ()
{
    int a[1000],n,i,c;
    scanf("%d",&n);
    getchar();//吞噬换行键
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    getchar();
    scanf("%d",&c);
    insert(a,n,c);
    PrintArr(a,n);
    return 0;
}
void PrintArr(int a[],int n)
{
    int i;
    for(i=0;i<n+1;i++)
    {
        printf("%d",a[i]);
        if(i<n) printf(" ");
    }
    printf("\n");
}
void insert(int a[], int n, int num)
{
    int i,t;
    for(i=n-1;i>=0;i--)//非递减,意思就是不是递减就行,因此倒序循环更直观
    {
        if(a[i]>num) a[i+1]=a[i];//i+1时数组向后多一位数字,只要num小,就从后一直移动
        else         break;//此时num大于a[i],跳出循环,让i后面的i+1等于num
    }
    a[i+1]=num;//因为原本的i+1在循环中被赋值给了i+2,因此不会缺少数字缺失。
}

今天的分享就到这里,依旧是每天一句话,我还年轻,吃苦趁现在

C语言书籍推荐从入门到进阶再到封神全套(2021年整理) 一、C语言书籍推荐入门初学,编程基础系列 1、《C语言程序设计:现代方法》(第2版) 至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经最初的候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强调标准 C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了 C99标准,并与 C89标准进行对照,补充了 C99中的最新特性。本书分为 C语言的基础特性、 C语言的高级特性、 C语言标准库参考资料 4个部分。每章末尾都有一个“问与答”小节给出一系列与 阅读详情

相关推荐

C语言后记-17 C语言推荐书籍(珍藏版)

1.《C语言程序设计:现代方法》(第2版)推荐理由:至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经最初的候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强调标准 C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了 C99标准,并与 C89标准进行对照,补充了 C99中的最新特性。本书分为 C语言的基础特性、 C语言的高级特性、 C语言标准库参考资料 4个部分。

CodeAllen嵌入式 6万+

郑轻oj1026

#include<stdio.h> #include<string.h> #include<math.h> //从键盘输入一个字符,判断该字符是否大写字母、小写字母、数字字符或其他字符。分别输出对应的提示信息。 //输入一个字符。 //如果该字符是大写字母,则输出“upper”;若是小写字母,则输出“lower”;若是数字字符, //则输出“digit”;若是其他字符,则输出“other”。(输出不含双引号)。 int main() { //思路:把对应的字符分到相应的.

NEWEVA__zzera22的博客 329

M1安装homebrew报错LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54解决方法

在mac系统中,使用homebrew可以很方便的管理包。但按照官网的说明执行命令总是报错原因是这个资源访问有问题,那么我们可以直接使用国内的镜像。给大家推荐一个中国科学技术大学的镜像站,里面有各种资源https言归正传,开始踩坑。......

qq_42427085的博客 1420

1112: 进制转换(函数专题)

题目描述 输入一个十进制整数n,输出对应的二进制整数。常用的转换方法为“除2取余,倒序排列”。将一个十进制数除以2,得到余数商,将得到的商再除以2,依次类推,直到商等于0为止,倒取除得的余数,即为所求的二进制数。例如,把52换算成二进制数的计算过程如下图: 52除以2得到的余数依次为0,0,1,0,1,1,倒序排列,得到52对应的二进制数110100。 用递归的思想来描述上述计算过程是这样的:...

weixin_46091417的博客 1976

进制转换(函数专题)

【代码】进制转换(函数专题)

reisenx11的博客 289

集训小记 5

在记一道题 [提交][状态][论坛] 题目描述 输入一个十进制整数n,输出对应的二进制整数。常用的转换方法为“除2取余,倒序排列”。将一个十进制数除以2,得到余数商,将得到的商再除以2,依次类推,直到商等于0为止,倒取除得的余数,即为所求的二进制数。例如,把52换算成二进制数: 52除以2得到的余数依次为0,0,1,0,1,1,倒序排列,得到52对应的二进制数11

a141210104的专栏 638

进制转换专题

近来刷题库多次遇到进制转换类型题目,故写此博客,以作总结 进制转换大致分三类:1.n进制转10进制。 2.10进制转n进制。 3.n进制转m进制。 一 . n进制转10进制。 思路: 由于存在11进制到16进制的转换,可能会出现字母,因此使用字...

Mikesuper_blog的博客 600

初学c语言中的一些常见代码

1.输出乘法口诀表 #include<stdio.h> int main() { int i = 0; for (i = 1; i < 10; i++) { //打印一行 int j = 0; for (j = 1; j <=i; j++) { printf("%d*%d = %-4d", j,i , i*j); } printf("\n...

赵佳敏的博客 2万+

【C语言】C语言特别篇--数组函数的实践 + 函数递归

本文通过多个实例介绍了数组函数在C语言中的应用。首先演示了二分查找算法的两种实现方式(普通版本函数版本),然后讲解了素数判断函数。接着展示了如何通过函数实现数组打印逆置操作,并详细介绍了扫雷游戏的多文件实现过程。文章还分享了VS调试技巧,包括断设置、快捷键使用等。最后通过阶乘计算、数字逐位打印斐波那契数列等示例,讲解了递归与迭代的实现方法优缺比较。特别指出递归虽然简洁但可能存在效率问题,而迭代方式通常执行更快。这些案例有助于初学者深入理解C语言数组函数的应用。

小年糕的博客 1892

C语言入门讲义(竞赛向)

_“首先欢迎大家来到ACM这个大集体,不管你有无基础,只要跟着我们ACM队伍集训,不久的将来,你也会是一个很强大的ACMer,让我们一切的一切都从Hello World开始吧!”_

2302_79577794的博客 1万+

初学C语言常见错误

C语言常见错误

angel_yc的博客 3743

【C语言初学C语言经典题目(范围广,内容多)

✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨送给各位的一句话:既要脚踏实地 又要仰望星空 ✨说明:无论做什么事情,我们既要有高远的理想,也要有脚踏实地的精神态度 目录 前言😄 scanf函数的使用🔥 判断素数🔥 闰年判断🔥 九九乘法表🔥 在一个有序数组中查找数字🔥 N阶乘的值🔥 计算1!+2!+......+n!🔥 两边向中间移动🔥 模拟登录操作🔥 猜数字🔥 关机程序🔥 模拟实现strlen()函数🔥 递归实现计算一个数的每位之..

weixin_60478154的博客 3526

【C语言初学总结】--- C语言函数

【C语言初学总结】 C语言函数 函数 1.函数的定义 函数定义就是函数体的实现,函数体就是一个代码块,他在函数调用执行,与函数定义相反,函数声明出现在函数被调用的地方。 1.1函数注意: 每条语句后边必须要有;号(条件语句等特殊情况除外) C语言中本身带了很多库函数,并分门类的放在了不同的头文件中,使用只要引用对应正确的头文件即可。 除了C语言自带函数之外,我们也可以编写自己的函数,称之为自...

L19002S的博客 3114

C语言递归:简单入门指南

本文为递归入门教程,旨在帮助初学者理解递归的基本概念。通过倒计、阶乘等简单示例,讲解递归的三要素:终止条件、递归调用问题简化。文章对比了递归与循环的不同实现方式,并介绍了递归的调试技巧适用场景,如汉诺塔问题。内容涵盖数学计算、数组操作等实践例子,帮助读者建立递归思维方式,学会分解复杂问题并避免常见错误

2503_92860243的博客 1124

函数递归入门

函数递归入门

tgwj001的博客 1012

初学C语言 - 函数以及相关的例题(非常详细,具思考过程)

一个过程或函数在其定义或说明中有直接或间接的调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量。我们开发的过程中每个程序员都可能用的到,为了支持可移植性提高程序的效率,所以c语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。逗号表达式的值是最后一个表达式的值。,因为代码的运行是从上往下的,如果函数的定义在开头,程序就会直接识别这个函数,不需要声明。

E_Lonely的博客 2187

c语言字符串递归例子,c语言函数递归(简单的递归例子c语言)

若在main函数中调用hanoi(3,'A','B','c')运行结果 void move(char getone,char .分成三组: (), 目的:将1号2号从A移到B 调用函数:hanoi(2,'A', 'C', 'B')。 在hanoi(2,'A', 'C', 'B')递归调用如下: A-->C----hanoi(1,'A', 'B', 'C') A-->B----ha...

weixin_33413839的博客 1156

C语言初学笔记

在编程语言中,数据类型是一个非常重要的概念,它用于指定变量可以存储的数据种类以及这些数据在内存中的存储方式。实参数组名代表一个固定的地址,或者说是指针常量,但形参数组并不是一个固定的地址值,而是作为指针变量,在函数调用开始,它的值等于实参数组首元素的地址,在函数执行期间,它可以再被赋值。数组名 a 代表数组首元素的地址,它是一个指针常量,它的值在程序运行期间是固定不变的。既然 a 是常量,所以 a++ 是无法实现的。,它们就成为指向列的指针,分别指向 a 数组0行0列的元素1行0列的元素的地址。

2302_81925328的博客 1621

C语言|初学C语言常见问题集

总结C语言做题过程中碰到的一些问题,写的不好,望各位大佬多多指教

m0_52094687的博客 1364

C语言入门——函数

目录 一、函数是什么 1、定义 2、C语言函数的分类 二、库函数 1、C语言常用的库函数 2、查询工具 三、自定义函数 四、函数参数 1、实际参数(实参) 2、形式参数(形参) 五、函数调用 1、传值调用 2、传址调用 六、函数练习 1、打印出100-200间所有的素数 2、打印出1000-2000年中的闰年 3、实现一个整型有序数组的二分查找 4、每调用一次函数,就将num的值增加1 七、函数的嵌套调用链式访问 1、嵌套调用 2、链式访问 八、函数的声明

xcxhzjl的博客 819
上一篇: (C语言入门)初做PTA乙级出现的问题
下一篇: 字符串入门和初学字符串常见问题
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗蛋今天也要努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值