C语言递归刷题(一)

走台阶

题目

描述
小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?

输入描述:
输入包含一个整数n (1 ≤ n ≤ 30)
输出描述:
输出一个整数,即小乐乐可以走的方法数。
示例1
输入:
2
输出 :
2
示例2
输入:
10
输出:
89

思路

走台阶的这种就类似于斐波那契数列
f(n-1) + f(n-2)
从第三项开始,前两项的和等于第三项
这个范围比较小,可以使用斐波那契数列,递归的思想
结束条件: n < 3
多思考结束条件,递归自然就能写出来

代码

#include <stdio.h>

int func(int n)
{
    if(n < 3)
    return n;
    else
    return func(n-2)+func(n-1);
}
int main() 
{
    int n = 0;
    scanf("%d",&n);
    int ret = func(n);   
    printf("%d",ret);
    
    return 0;
}

西格玛

题目

描述
牛牛最近学会了一些简单的数学运算,例如
(1+2+3…+n-1+n) 请你帮他模拟一下这个运算。
输入描述:
输入仅一个正整数 n
输出描述:
请你计算

示例1
输入:
4
输出:
10

思路

例子给了,比如算前4项的和,1+2+3+4 = 10
那么结束条件是 n == 1,算到1就结束了
继续的条件是 n + func(n-1)

代码

#include <stdio.h>

int func(int n)
{
    if(n == 1)
    return 1;
    else
    return n + func(n-1);
}
int main() 
{
    int n = 0;
    scanf("%d",&n);
    int ret = func(n);
    printf("%d",ret);

    return 0;
}

用函数实现数的阶乘

题目

描述
编写一个函数 long long factorial(int n),用于计算 n 的阶乘。(要求使用递归实现)
输入描述:
键盘输入任意一个整数 n ,范围为 1 - 20
输出描述:
输出 n 的阶乘

示例1
输入:
5
输出:
120

思路

n*(n-1) * (n-2) …,比如:5 * 4 * 3 * 2 * 1,
结束条件是:n == 1,乘到1就结束
继续条件是:n * func(n-1)

代码

#include <iostream>
using namespace std;

long long factorial(int n);

int main() {

    int n;
    cin >> n;

    cout << factorial(n) << endl;

    return 0;
}
long long func(int n)
{
    if(n == 1)
    return n;
    else
    return n*func(n-1);
}
long long factorial(int n) {
         
    scanf("%d",&n);
    long long ret = func(n);
    
    return ret;
}

digit

题目

描述
牛牛定义了一个函数 digit(x,i) ,表示分离出 x 的后 i 位的数字。

输入描述:
输入两个正整数 x 和 i
输出描述:
输出 x 的后 i 位数字

示例1
输入:
23908 3
输出:
908

思路

用 i 进行计数
结束条件是:i == 0
i 为 0 就得到了后i个数了
继续条件是 : x%10*(pow(10,t++)) + digit(x/10,–i,t)
用t进行计数,开始个位数是10的0次方,十位数是10的1次方,然后个位,十位,百位加起来就是要求的数

代码

#include <stdio.h>
#include<math.h>

int digit(int x,int i,int t)
{
    if(i == 0)
    return 0;
    else
    return x%10*(pow(10,t++)) + digit(x/10,--i,t);
}
int main() 
{
    int x = 0;
    int i = 0;
    scanf("%d %d",&x,&i);
    int count = 0;
    int t = 0;
    int ret = digit(x,i,t);
    printf("%d",ret);

    return 0;
}

Hermite多项式

题目

在这里插入图片描述

思路

这种题其实是水题,直接根据题目条件列出来就行了
就是满足上面的三个条件各写一个表达式
写三个if还不行,我也不是特别清楚,感觉是牛客要求要一个条件返回0的

代码

#include <stdio.h>

int Hermite(int n,int x)
{
    if(n == 0)
    return 1;
    else if(n == 1)
    return n*2;
    else 
    return 2*x*(Hermite(n-1,x)) - 2*(n-1)*(Hermite(n-2,x));
}
int main() 
{
    int n = 0;
    int x = 0;
    scanf("%d %d",&n,&x);
    int ret = Hermite(n,x);
    printf("%d",ret);

    return 0;
}
#include <stdio.h>

int Hermite(int n,int x)
{
    if(n == 1)
    return n*2;
    if(n > 1)
    return 2*x*(Hermite(n-1,x)) - 2*(n-1)*(Hermite(n-2,x));
    if(n == 0)
    return 1;
    return 0;
    //三个条件都不满足返回0
}
int main() 
{
    int n = 0;
    int x = 0;
    scanf("%d %d",&n,&x);
    int ret = Hermite(n,x);
    printf("%d",ret);

    return 0;
}

排列数

题目

在这里插入图片描述

思路

这题是排列组合的公式
结束条件:

  • m > n 时,比如 m = 3,n = 2,那么210 = 0
  • m = 0时,结果是1
    m 是计算的次数
    n 往下乘的数
    继续条件是:n*func(n-1,–m)

代码

#include <stdio.h>

int func(int n,int m)
{
    if(m == 0)
    return 1;
    else if(m>n)
    return 0;
    // m = 3 n = 2 2*1*0
    else if(n>0)
    return n*func(n-1,--m);
    else 
    return 0;
}
int main() 
{
    int m = 0;
    int n = 0;
    scanf("%d %d",&n,&m);
    // 输入的顺序也不能弄反
    int ret = func(n,m);
    printf("%d",ret);

    return 0;
}

逆序输出

题目

描述
牛牛在尝试把一个整数逆序地输出。

输入描述:
输入一个正整数 n。保证个位数不是 0
输出描述:
逆序输出这个正整数。

示例1
输入:
2345

输出:
5432

思路

结束条件就是 n == 0的时候,因为它的个位数不是0嘛
继续的条件是:func(n/10)
而且要先打印,得到的最后一位数
先打印掉个位数,个位数再除10变成0结束

代码

#include <stdio.h>
#include<stdlib.h>

void func(int n)
{
   if(n == 0)
    return;
    //结束时必须返回,不然不会结束,而且不能去打印
   else
    printf("%d",n%10);
    func(n/10);
}
int main() 
{
    int n = 0;
    scanf("%d",&n);    
    func(n);

    return 0;
}

结语

递归最重要的就是去思考它的结束条件
如果有不足之处,还望博友们指出
最后祝福我们题题AC

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值