<_>声明:本人小白一枚。eee第一次写blog如有错误,欢迎指出。
解释递归概念的文章不难找到。 这里从我们学校c语言练习题里面搬简单的递归实例
手上有一叠牌, 把第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n. 重复以下操作: 把第一张牌扔掉, 然后把新的第一张牌放到整叠牌的最后. 问最后扔掉的是哪一张?
Standard Input 有多组测试数据。输入的第一行是整数T(1<=T<=100),表示随后有T组测试数据。每组测试数据占一行,该行是一个正整数n, n <= 200.
Standard Output 对应每组测试数据,输出最后扔掉的那张牌编号, 占一行.
递推公式 f(2n)=2f(n),f(2n-1)=2f(n)-2f(1)=1
参考代码
#include<stdio.h> #include<stdlib.h> int solve(int n); int main() { //int T; //scanf("%d", &T); //while(T--) //{ int k; scanf("%d", &k); printf("%d\n", solve(k)); //}(需要直接按题目样式输出把//去掉即可) return 0; } int solve(int n) { int f; if(n==1) f = 1; else if(n%2==0) f = 2 * solve(n / 2); else f = 2 * solve((n + 1) / 2) - 2; return f; }在m只猴子聚在一起选大王, 商定规则如下: 大家围成一圈, 按顺时针从1编号, 第一次从编号为1的开始报数, 以后循环进行, 当报到n时退出圈子, 下一只则重新从1开始报数, 圈子中剩下的最后一只猴子则为大王.
Standard Input 有多组测试数据. 输入的第一行是整数T(1<=T<=100), 表示随后测试数据的组数. 每组测试数据占一行, 由正整数m和n组成, 两数之间有一个空格. 2 <= m,n <= 200. Standard Output 对应每组测试数据, 输出选出的大王的猴子编号.
递推公式:f(1,n)=1,f(m,n)=(f(m-1,n)+n)%m.
参考代码
#include <stdio.h> #include<stdlib.h> int solve(int m,int n); int main() { //int T; //scanf("%d", &T); //getchar(); //while(T--) /{ int m, n; scanf("%d %d", &m,&n); printf("%d\n",solve(m,n)); //} return 0; } int solve(int m,int n) { int f; if(m==1) f = 1; else f = (solve(m - 1, n) + n) % m; if(f==0) f = m; return f; }There are N people passing the ball. It starts from the first person, and each time the person who gets the ball should pass the ball to another one. So what is the number of situations in which the ball is passed back to the first person after passing M times. 大概就是N个人传球,问传过M次之后传回第一个人的有多少种情况,其中 N∈[2,9],M∈[1,15]. Standard Input Including two integers N and M, and N∈[2,9],M∈[1,15]. 读入N,M Standard Output The answer,and it does not exceed 2^31. 输出结果 递推公式:〖f(m,n)=(m-1)〗^(n-1)-f(m,n-1)
#include<stdio.h> #include<stdlib.h> int solve(int m, int n); int my_pow(int x,int t); int main() { int m, n; scanf("%d %d", &m, &n); printf("%d", solve(m, n)); return 0; } int solve(int m,int n) { int ans; if(n==1) ans = 0; else ans =my_pow(m-1,n-1)-solve(m,n-1); return ans; } int my_pow(int x,int t)//(math.h)用里面的pow函数来求幂误差挺大的,小整数的整数次幂比较好算,就自己写了个 { int ans=1; for (int i=1;i<=t;i++) ans = x * ans; return ans; }对于正整数a和n, 求a^ n一般考虑成n个a相乘. 但这样运算不够快速. 当n为偶数时, a^ n可表示为(a^ 2)^ (n/2); 当a为奇数时, a^ n可表示为(a^ 2)^ (n/2)再乘a. 你的任务是在给出a和n的情况下, 利用这种算法求出a^n. 要求: 1. 定义结构体表示一个大整数; 2. 大整数乘法写成自定义函数; 3. 快速幂算法写成自定义递归函数.
Standard Input 有多组测试数据.输入的第一行是整数T(1<=T<=20), 表示随后测试数据的组数. 每组测试数据占一行, 由正整数a和n组成, 两数之间有一个空格. 0 < a < 100, 0 < n < 200. Standard Output 对应每组测试数据, 输出一行a^n的准确结果.
#include<stdio.h> #include<stdlib.h> #include<string.h> #define Max 400 struct large_num { int num[Max]; int length; }; void solve(); struct large_num my_power(struct large_num a, int n); struct large_num my_mutiply(struct large_num a, struct large_num b); int main() { // int T; //scanf("%d", &T); //while(getchar()!='\n'); //while(T--) solve(); return 0; } void solve() { int a, n; scanf("%d %d", &a, &n); struct large_num num_a,ans; memset(&num_a, 0, sizeof(num_a)); num_a.num[Max-1] = a%10; num_a.num[Max-2] = a/10; num_a.length = (a/10!=0)?2:1; ans = my_power(num_a, n); for (int i=ans.length;i>=1;i--) printf("%d", ans.num[Max - i]); printf("\n"); } struct large_num my_power(struct large_num a, int n)// { struct large_num ans1; memset(&ans1, 0, sizeof(ans1)); if(n==1) ans1 = a; else { if(n==2) ans1 = my_mutiply(a, a); else { if(n%2==0) ans1 = my_power(my_power(a, 2), n / 2); else ans1 = my_mutiply(my_power(my_power(a, 2), (n-1)/ 2),a); } } return ans1; } struct large_num my_mutiply(struct large_num a, struct large_num b) { struct large_num ans2; memset(&ans2, 0, sizeof(ans2)); int l = a.length +b.length; for (int i=1;i<=a.length;i++) { for (int j = 1; j <= b.length;j++) ans2.num[Max - (i + j) + 1] += (a.num[Max-i] )* (b.num[Max-j]); } for (int k = 1;k<=l-1;k++) { ans2.num[Max - k - 1] += (ans2.num[Max - k]) / 10; ans2.num[Max - k ] =(ans2.num[Max-k])%10; } ans2.length = (ans2.num[Max - l]!=0) ? l:(l - 1); return ans2; }来源:https://acm.uestc.edu.cn/contest