首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >3道编程入门必刷题:从递归规律到图案输出,附避坑题解

3道编程入门必刷题:从递归规律到图案输出,附避坑题解

作者头像
用户11944663
发布2025-12-22 11:04:07
发布2025-12-22 11:04:07
1280
举报

3道编程入门必刷题:从递归规律到图案输出,附避坑题解

作为编程入门选手,经常会遇到递归规律题、图案输出题、多组输入题这三类基础题——它们看似简单,但容易踩坑(比如递归的规律找错、图案的空格/星号数量算错)。今天就拆解3道经典入门题,结合错误题解的坑点+正确解法,帮你巩固基础!

一、题1:递归中的规律找对了吗?(无限递归的ans计算)

在这里插入图片描述
在这里插入图片描述
题目简化

有一个递归函数 dfs(cnt)(从dfs(1)开始),每次先执行for(i=1到cnt) ans++,再调用dfs(cnt+2)。求“递归n层后”ans的值(输入0≤n≤1e9)。

思路分析

很多人会像原代码那样直接写ans = n*n,但这是错误的——得先模拟递归过程找规律:

  • 递归“层”的定义:每调用一次dfs算一层。比如从dfs(1)开始,第1层是dfs(1),第2层是dfs(3),第3层是dfs(5)
  • 每层对ans的贡献:第k层的cnt = 2k-1,所以该层for循环会让ans增加2k-1

当递归n层时,ans前n个奇数的和——而前n个奇数的和恰好是!(比如n=2时,1+3=4=2²,对应示例输入2的输出)。

不过原代码的问题是:没考虑输入n=0的情况(输入0时ans应该是0,但原代码会输出0*0=0,这部分是对的,但逻辑描述不清晰)。

正确题解(C语言)
代码语言:javascript
复制
#include<stdio.h>
int main() {
    long long n; // 注意n最大是1e9,n²会超过int范围,要用long long
    scanf("%lld", &n);
    printf("%lld\n", n * n);
    return 0;
}
考点总结
  • 递归题优先找数学规律(避免真的写递归,否则会栈溢出);
  • 注意数据范围:1e9的平方会超过int(最大约2e9),必须用long long

二、题2:双层金字塔怎么输出?(空格+星号的数量规律)

在这里插入图片描述
在这里插入图片描述
题目简化

输入整数n(2≤n≤9),输出“双层金字塔”(比如n=2时输出1个星、3个星、1个星;n=5时输出1、3、5、7、9、7、5、3、1个星)。

思路分析

双层金字塔分为上层(从1个星到n个星,每次+2)和下层(从n-1个星到1个星,每次-2),核心是算对每行的空格数+星号数

  • 上层第i行(i从1到n):
    • 空格数:n - i(比如n=2,i=1时空格数1,i=2时空格数0);
    • 星号数:2*i - 1(i=1→1个,i=2→3个)。
  • 下层第i行(i从1到n-1):
    • 空格数:i(比如n=2,i=1时空格数1);
    • 星号数:2*(n - i) - 1(i=1→2*(2-1)-1=1个)。
原代码的坑点
在这里插入图片描述
在这里插入图片描述

原代码中j的循环条件写了j<=n-i,但实际是j从1到n-i,循环变量应该是j++(原代码写了i++,这是语法错误,会导致死循环)。

正确题解(C语言)
代码语言:javascript
复制
#include<stdio.h>
int main() {
    int n;
    while (scanf("%d", &n) != EOF) { // 多组输入
        // 输出上层金字塔
        for (int i = 1; i <= n; i++) {
            // 打印空格
            for (int j = 1; j <= n - i; j++) {
                printf(" ");
            }
            // 打印星号
            for (int k = 1; k <= 2 * i - 1; k++) {
                printf("*");
            }
            printf("\n");
        }
        // 输出下层金字塔
        for (int i = 1; i <= n - 1; i++) {
            // 打印空格
            for (int j = 1; j <= i; j++) {
                printf(" ");
            }
            // 打印星号
            for (int k = 1; k <= 2 * (n - i) - 1; k++) {
                printf("*");
            }
            printf("\n");
        }
    }
    return 0;
}
考点总结
  • 图案题的核心是找“行号”和“空格/字符数”的数学关系
  • 多组输入用while(scanf(...)!=EOF)处理;
  • 循环变量不要写错(比如把j++写成i++会导致逻辑混乱)。

三、题3:多组输入的大小比较(格式+条件判断)

在这里插入图片描述
在这里插入图片描述
题目简化

多组输入两个整数,输出“a=b”“a>b”“a<b”的格式(数字和符号之间无空格)。

思路分析
  • 多组输入:用while(scanf("%d %d", &a, &b)!=EOF)循环读取;
  • 条件判断:依次判断a==ba>ba<b,注意输出格式要和题目一致(比如1=1而不是1 = 1)。
原代码的坑点
  • printf的格式字符串错误:比如"%d=%d\n"是对的,但原代码里写了"%d=%d\n"但变量顺序是a,b,这部分是对的,但else if的条件可以简化(不需要第三个else if,直接用else即可);
  • 输入格式:scanf("%d%d")中间没加空格,可能导致输入错误(应该写scanf("%d %d", &a, &b))。
正确题解(C语言)
代码语言:javascript
复制
#include<stdio.h>
int main() {
    long long a, b; // 题目说范围是-2^31~2^31-1,用long long更安全
    while (scanf("%lld %lld", &a, &b)!= EOF) {
        if (a == b) {
            printf("%lld=%lld\n", a, b);
        } else if (a > b) {
            printf("%lld>%lld\n", a, b);
        } else {
            printf("%lld<%lld\n", a, b);
        }
    }
    return 0;
}
考点总结
  • 多组输入的处理方式(while+scanf);
  • 输出格式要严格匹配题目要求(无空格、符号正确);
  • 数据范围:-2^31int的最小值,但计算时用long long更安全。

写在最后:入门题的“坑”和“得”

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

这3道题都是编程入门的高频题,看似简单但容易踩坑——比如递归题的规律、图案题的循环变量、多组输入的格式。入门阶段练这类题,核心是找规律、理清楚循环逻辑、注意数据范围和格式,这些细节会直接影响代码是否能AC~

要不要我帮你整理一份编程入门必刷题的考点清单,涵盖递归、图案、多组输入等常见题型的核心注意点?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3道编程入门必刷题:从递归规律到图案输出,附避坑题解
    • 一、题1:递归中的规律找对了吗?(无限递归的ans计算)
      • 题目简化
      • 思路分析
      • 正确题解(C语言)
      • 考点总结
    • 二、题2:双层金字塔怎么输出?(空格+星号的数量规律)
      • 题目简化
      • 思路分析
      • 原代码的坑点
      • 正确题解(C语言)
      • 考点总结
    • 三、题3:多组输入的大小比较(格式+条件判断)
      • 题目简化
      • 思路分析
      • 原代码的坑点
      • 正确题解(C语言)
      • 考点总结
    • 写在最后:入门题的“坑”和“得”
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档