目录
- 走台阶
- 题目
- 思路
- 代码
- 西格玛
- 题目
- 思路
- 代码
- 用函数实现数的阶乘
- 题目
- 思路
- 代码
- digit
- 题目
- 思路
- 代码
- Hermite多项式
- 题目
- 思路
- 代码
- 排列数
- 题目
- 思路
- 代码
- 逆序输出
- 题目
- 思路
- 代码
- 结语
走台阶
题目
描述
小乐乐上课需要走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;elsereturn 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;elsereturn 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;elsereturn 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;elsereturn 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*0else 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;//结束时必须返回,不然不会结束,而且不能去打印elseprintf("%d",n%10);func(n/10);
}
int main()
{int n = 0;scanf("%d",&n); func(n);return 0;
}
结语
递归最重要的就是去思考它的结束条件
如果有不足之处,还望博友们指出
最后祝福我们题题AC