C语言xio习笔记1-递归函数实例

  • 1.翻牌问题
  • 2.猴子选大王
  • 3. Passing the Ball
  • 4.快速求幂

<_>声明:本人小白一枚。eee第一次写blog如有错误,欢迎指出。

解释递归概念的文章不难找到。
这里从我们学校c语言练习题里面搬简单的递归实例

1.翻牌问题

手上有一叠牌, 把第一张牌(即位于顶面的牌)开始从上往下依次编号为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;elseif(n%2==0)f = 2 * solve(n / 2);elsef = 2 * solve((n + 1) / 2) - 2;return f;
}

2.猴子选大王

在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;elsef = (solve(m - 1, n) + n) % m;if(f==0)f = m;return f;
}

3. Passing the Ball

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;elseans =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;
}

4.快速求幂

对于正整数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);elseans1 = 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

C语言xio习笔记1递归函数实例相关推荐

  1. Maven-学习笔记06【基础-Maven工程servlet实例】

    Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...

  2. C语言深度剖析笔记2

    接上半部分 C语言深度剖析笔记1 https://blog.csdn.net/halazi100/article/details/125844487 C语言深度剖析笔记1 指针 变量回顾 既然程序中的 ...

  3. Linux C-学习笔记(二)

    为熟悉对Linux C的基本操作,阅读书籍<Linux C编程从入门到实践-程国刚等>与<Linux C从入门到精通-明日科技>,此为学习笔记.(四到六章) Linux C-学 ...

  4. php大牛额城战笔记,PHP语言大牛开发笔记(8)——MySQL数据库基础回顾[2]

    本文主要向大家介绍了PHP语言大牛开发笔记(8)--MySQL数据库基础回顾[2],通过具体的实例向大家展示,希望对大家学习php语言有所帮助. 一.数据表 为了确保数据的完整性和一致性,在创建表时指 ...

  5. Spring-学习笔记02【程序间耦合】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  6. MyBatis-学习笔记05【05.使用Mybatis完成CRUD】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  7. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  8. Maven-学习笔记05【基础-使用骨架创建Maven的Java工程】

    Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...

  9. Maven-学习笔记04【基础-Maven生命周期和概念模型图】

    Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...

  10. Maven-学习笔记03【基础-Maven标准目录结构和常用命令】

    Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...

最新文章

  1. OSChina 周一乱弹 —— 嫂子我帮你们照顾放心吧
  2. 悲观锁和乐观锁_乐观锁和悲观锁 以及 乐观锁的一种实现方式-CAS
  3. DataGrip 2019.2.5 —— MySQL数据表迁移到SQL Server数据表解决方案
  4. KUKA profesafe
  5. python安全攻防---scapy使用
  6. How to create a DXL attribute using a DXL script
  7. matlab画图的参数,matlab画图参数
  8. IOS如何使用第三方字体
  9. 三段式状态机_verilog
  10. 如何压缩图片大小到100K以下
  11. C++中继承时的重载和重新定义
  12. NFT吸血DeFi,冰火两重天
  13. 三大微分中值定理及泰勒中值定理证明
  14. Micropython八位共阴数码管驱动模块分享
  15. [WPF] WPF浏览器程序:如何发布并解决不信任程序问题
  16. Unity3D - 使用天空盒子(Using Skyboxes)
  17. Resources资源
  18. TI CC3200 WIFI实训开发套件(OURS-SDK-WFB)IAR for ARM7.8调试2————对IAR for ARM的熟悉,并在开发板上跑起来第一个程序
  19. ARP局域网断网攻击原理分析及演示
  20. 处理器cpu测试工具

热门文章

  1. 四月Google份额继续上升 微软收购雅虎势在必行
  2. 高龄脑卒中患者的运动处方
  3. QT 代码添加QScrollArea
  4. html和flash播放器区别,flash播放器和一般播放器有什么区别
  5. web程序中的用户注册
  6. Android开发:基站定位
  7. 在火狐浏览器打开xpath_Firefox火狐插件firebug和xpath checker提取关键词
  8. 神经网络算法用什么软件,神经网络计算机应用
  9. Mybatis与JPA的优缺点
  10. 进程隐藏博文 hook