首页 > 其他分享 >重温c语言之,7天开整,就是随便的写写,第八天

重温c语言之,7天开整,就是随便的写写,第八天

时间:2024-11-08 09:23:28浏览次数:4  
标签:第八天 int ret 写写 -- num printf 天开 盘子

一:函数

  1、递归

  题目:求n的阶乘(不考虑溢出)

  上代码

 1 #include<stdio.h>
 2 int factorial(int n) {
 3     if (n > 1) {
 4         return n * (factorial(n - 1));
 5     }
 6     else
 7     {
 8         return 1;
 9     }
10 }
11 #include<stdio.h>
12 int main()
13 {
14     int num = 0;
15     printf("请打出想要输出的数的阶乘:");
16     scanf("%d", &num);
17     int ret=factorial(num);
18     printf("%d\n", ret);
19     return 0;
20 }

  这里就是:运用了阶乘运算的思想,

  1!=1*1

  2!=2*1!

  3!=3*2!

  4!=4*3!

  ·······

  n!=n*(n-1)!

  所以这里就是运用这个想法来将运行的步骤进行简略,从而使代码变成2行

 

  斐波那契数列:

 1 //斐波那契数列:f(n)=f(n-1)+f(n-2);
 2 // 1,1,2,3,5,8,13,21,34,55
 3 //求第n个斐波那契数
 4 int sequence(int n) {
 5     int ret = 0;
 6     if (n > 2) {
 7         ret = sequence(n - 1) + sequence(n - 2);
 8     }
 9     else
10     {
11         ret = 1;
12     }
13     return ret;
14 }
15 #include<stdio.h>
16 int    main() {
17     int num = 0;
18     printf("请输入一个数字:");
19     scanf("%d", &num);
20     printf("这个数字的斐波那契值是:%d\n", sequence(num));
21     return 0;
22 }

 

 

  这里还有一个非常经典的递归题目:汉诺塔

  从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

  先上代码,然后解释

 1 #include<stdio.h>
 2 //n代表的是盘子数量
 3 //a是起始位置
 4 //b是中间位置
 5 //c是最终位置
 6 int move_cout = 0;
 7 void move(char a, char c) {
 8     printf("%c-->%c ", a, c);
 9     move_cout++;
10 }
11 void Hanoi(int n,char a,char b,char c) {
12     
13     if (n==1)
14     {
15         move(a, c);
16     }
17     else
18     {
19         Hanoi(n-1, a, c, b);
20         move(a, c);
21         Hanoi(n - 1, b, a, c);
22     }
23 
24 }
25 int main()
26 {
27     int n = 0;
28     printf("请输入A盘上有多少个盘子:");
29     scanf("%d", &n);
30     Hanoi(n,'A','B','C');
31     printf("\n%d\n", move_cout);
32     return 0;
33 }

  这里先想,如果只有一个盘子,那会发生什么:A-->C,将a上面的盘子直接移动到c上面

  再想,如果a上面有2个盘子呢,A-->B, A-->C ,B-->C,先将a最上面的盘子移动到c,再将a上面的盘子移动到c盘,最后将b盘上面的盘子移动到c盘

  再次想象,如果a上面有3个盘子呢,A-->C, A-->B, C-->B, A-->C, B-->A, B-->C, A-->C,现将a最上面的盘子移动到c,再将a里面的第二个盘子移动到b,再讲c里面的盘子移动到b,之后就把a上面最后一个盘子移动到c,然后将b上面的盘子移动到a,之后再将b的盘子移动到c,最后将a的盘子移动到c,完成移动

  由此可得,盘子移动有两种情况,1种:只有或者只剩下一个盘子的时候,只需将盘子移动到c即可;2种:盘子的数量大于1个的时候,那就需要这3根柱子相互配合,一起完成操作,最终才能将盘子移动到c柱子上面,这里只不过递归了移动这个步骤

 

 

 

   2、迭代

  也是求阶乘,题目与上述的是一样的

  直接上代码:

 1 #include<stdio.h>
 2 int factorial(int n) {
 3     int ret = 1;
 4     for (int i = 1; i <= n; i++)
 5     {
 6         ret *= i;
 7     }
 8     return ret;
 9 }
10 #include<stdio.h>
11 int main()
12 {
13     int num = 0;
14     printf("请打出想要输出的数的阶乘:");
15     scanf("%d", &num);
16     int ret=factorial(num);
17     printf("%d\n", ret);
18     return 0;
19 }

  这里用到了迭代(循环)

 

  斐波那契数列:

 1 #include<stdio.h>
 2 
 3 int sequence(int n) {
 4     int a = 1;
 5     int b = 1;
 6     int ret = 0;
 7     if (n>2)
 8     {
 9         for (int i = 0; i < n - 2; i++) {
10             ret = a + b;
11             a = b;
12             b = ret;
13         }
14         return ret;
15     }
16     else
17     {
18         ret = 1;
19     }
20     return ret;
21 }
22 int    main() {
23     int num = 0;
24     printf("请输入一个数字:");
25     scanf("%d", &num);
26     printf("这个数字的斐波那契值是:%d\n", sequence(num));
27     return 0;
28 }

  交换位置,来计算数列值

 

总结:递归代码简单,但是效率太低

   迭代代码复杂,但是效率高

 

标签:第八天,int,ret,写写,--,num,printf,天开,盘子
From: https://www.cnblogs.com/xiejinghao/p/18531523

相关文章

  • 重温c语言之,7天开整,就是随便的写写,第七天
    一:素数又见素数但这次不一样,这次需要用到函数,利用函数来将素数区分出来,直接上代码1#include<stdio.h>2#include<math.h>3intprime_num(intnum)4{5for(inti=2;i<sqrt(num);i++)6{7if(num%i==0)8{9......
  • 重温c语言之,7天开整,就是随便的写写,第六天
    一:字符串相比较题目:编写代码实现,模拟用户登录情景,并且只能登录3次。(只允许输入3次密码,密码正确则提示输入成功,如果三次都输入错误,则退出程序)这里就是用到了strcmp这个函数,其实这个函数是让两个字符串同时从左到右转换成ASCLL码,之后两个字符,前面的减去后面的,如果全部减......
  • Java第八天(实训学习整理资料(七)练习题)
    练习:1、输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取这个字符串,要求不准出现半个字符的现象2、输入一个字符串,提取这个字符串中的数字并求和->sdf85dfghd72s6->85726->283、输入一个字符串,提取这个字符串中的数字并排序->sdf85dfghd72......
  • 重温c语言之,7天开整,就是随便的写写,第五天
    一:库函数---printf()这个函数printf()的返回值是int,这个函数竟然有返回值,值的多少是取决于输出的内容有多少个字符二:循环1、for循环这个循环中,如果判断的地方省略的话,这个循环就是永远成立(恒成立),1for(;;)这样的话,就会无线循环下去--------(弊端1)......
  • 重温c语言之,7天开整,就是随便的写写,第三天+第四天版
    一:指针1、关于指针的含义---粗略例如:inta=10;int*p=&a;这里的*,是说明p是指针变量,int说明p是指向的对象是int类型的*p=20,这里的*是解引用符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象2、关于指针的大小......
  • 重温c语言之,7天开整,就是随便的写写,第二天
    一:操作符除法:如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3;如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础数据类型包含下的)完整的商(包含小数部分的):例如:7/2.0=3.500000;如果想要在pr......
  • 重温c语言之,7天开整,就是随便的写写,第一天
    一:转义字符\t是一个字符,在printf里面,只占一个位置;其他什么的抽象字符,用一个'\'+抽象字符就可以出现;\ddd这个是8进制的,可以转成10进制的,之后参考ASCLL码表即可二:枚举类型的函数与数组一样,有下标,都是从0开始的三:数组可以先不在【】这里面填写多少,但是需......
  • 实习冲刺第八天
    代码详解:这里使用快(一次移动两个节点)慢(一次移动一个节点)指针的办法解决,如果链表有环那么快指针和慢指针一定会相遇 ,如果没有环那么快指针会移动到NULL节点,这时结束并返回falseclassSolution{public:boolhasCycle(ListNode*head){ListNode*fast=head;//......
  • 代码随想录算法训练营第八天|leetcode344.反转字符串、leetcode541. 反转字符串II、卡
    1leetcode344.反转字符串题目链接:344.反转字符串-力扣(LeetCode)文章链接:代码随想录视频链接:字符串基础操作!|LeetCode:344.反转字符串_哔哩哔哩_bilibili自己的思路:直接使用python的内置函数reverse进行一个操作1.1自己的代码1.1.1python的内置函数classSolution:......
  • 学习java第八天
    一.方法重写/方法覆盖/Override为什么要进行方法重写/覆盖?子类不满足父类的逻辑,进行重写方法重写的注意事项:1.方法重写前提是必须要继承2.所继承的方法名必须一致,方法参数也要一致举例说明一个方法的三部分publicvoideat(){}第一部分头部 访问权限修饰符publicp......