《算法分析与设计》练习2

目录

A 递归求和

B 倒序输出

C 递归计数

D kimi数列

E 蜂房

F 骨牌覆盖


A 递归求和

题目描述

使用递归编写一个程序,求:
S(n)=1-1/2+1/3-1/4+1/5-1/6+......

输入

多组数据输入,每组输入一个正整数n。

输出

输出S(n)的计算结果(精确到小数点后六位)。

样例输入 Copy

1

样例输出 Copy

1.000000
分析:注意要是小数,  n为奇数时,为加数 即为正
                                    n为偶数时,为减数 即为负
     所以设一个 z=0来加  再总结出一个多项式 被加即可
     多项式为   pow(-1,i-1)*(1.0)/n;
代码实现:c语言

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

int main (){
int n;
while(~scanf("%d",&n))
{
digui(n,0);
}


return 0;
}

void digui(int n,double z){
if(n>0){
        double x=1.0/n;

    if(n%2==1)  digui(n-1,z+x);
    if(n%2==0)  digui(n-1,z-x);
}
else {
  printf("%lf\n",z);
}
}

B 倒序输出

题目描述

使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。

输入

多组输入,每组输入一个非负整数

输出

逆序输出结果,每个结果占一行。

样例输入 Copy

12
1230
0

样例输出 Copy

21
321
0
分析:题目是输入一个非负整数  所以不仅仅要考虑  1234  2345 等等这些正整数 还要考虑  0;
                                                  其中样例输入的  1230   样例输出 321,我们也要稍作处理
所以总体上用递归写的话要容易很多 
我们先用递归的方法求得是1234  2345这些正整数的解 
假设输入的正整数是  n
那么递归分为两步:一步是  n%10  求得最后一位数  然后输出。
                               二步是  返回 n/10  继续递归  求 最后一位数
然后假如这个整数是末尾为0的  1230  123000 这些正整数怎么办嘞
 我们可以在递归的参数里面多定义一个参数变量 sign  来标识,设sign初始值 为0
                                                                  if  sign==0 && n%10 ==0 我们就不输出,直接进行n/10 递归即可  可看  标记2
                                                                  else  我们就  输出 n%10 同时 令 sign=1  再递归   可看   标记3
可能有点抽象具体看代码实现
代码实现:c语言

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

int main (){

int n;
while(~scanf("%d",&n)){
        if(n==0) {
            printf("0");
            printf("\n");
        }
else{

    digui(n,0);
    printf("\n");
}

}



return 0;
}

void digui (int n,int sign){
    if(n>0)
    {

        int x=n%10;
        if(x==0&&sign==0)  digui(n/10,sign);     //  标记2
        else{
                sign=1;        //  标记3
            printf("%d",x);
              digui(n/10,sign);  //  标记3
        }

    }
}

C 递归计数

题目描述

编写一个递归程序,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。

输入

多组输入,每组包括一个仅由大小写字母组成的字符串。

输出

输出字符串中出现大写字母的数目

样例输入 Copy

AbcD

样例输出 Copy

2
分析:
这个题比较简单了,看代码即可
代码实现:c语言

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

int main (){

char a[100];

while(~scanf("%s",a)){
        int length=strlen(a);
    digui(a,0,0,length);
}



}
void digui (char a[],int i,int count,int length){
if(i<length)
{
    if(a[i]>='A'&&a[i]<='Z') digui(a,i+1,count+1,length);
    else digui(a,i+1,count,length);
}
if(i==length) printf("%d\n",count);

}

D kimi数列

题目描述

Kimi最近在研究一个数列:
* F(0) = 7
* F(1) = 11
* F(n) = F(n-1) + F(n-2) (n≥2)
Kimi称之为Kimi数列。请你帮忙确认一下数列中第n个数是否是3的倍数。

输入

输入包含多组数据。
每组数据包含一个整数n,(0≤n≤30)。

输出

对应每一组输入有一行输出。
如果F(n)是3的倍数,则输出“Yes”;否则输出“No”。

样例输入 Copy

0
1
2
3
4
5

样例输出 Copy

No
No
Yes
No
No
No
分析:我们可以先用递归求出  f(n) 的值 ,  再判断是否为3的倍数
          具体可看代码分析(这个递归求和属于基本东西,理解记忆)
代码分析:c语言

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

int main (){
int n;
while (~scanf("%d",&n)){
  three(digui(n));
}

return 0;
}


int  digui (int n){

if(n==0) return 7;
if(n==1) return 11;
if(n>1)  return digui(n-1)+digui(n-2);


}
void three(int n){
    if(n%3==0) printf("Yes\n");
    else printf("No\n");
}

E 蜂房

题目描述

有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。

输入

多组数据输入,每组数据包含两个正整数a, b,且 a<b。

输出

蜜蜂从蜂房a爬到蜂房b的可能路线数。

样例输入 Copy

1 2
3 4

样例输出 Copy

1
1
分析: 这个题其实和上kimi数列差不多 ,只是起始地点不一样了而已。
稍作探讨:我们假设 起点为p, 终点为q
 根据蜂房图形可知,第一    p肯定是要小于q滴
                                第二    if  q - p==1   则  return  1
                                第三    if  q - p==2   则  return  2
                                第四    if  q - p >2    则  return  digui(p,q-1)+digui(p,q-2);(就是前面两个蜂房的和)
                                                                      即   digui(p,q)等于  digui(p,q-1)加上  digui(p,q-2);
具体请看代码实现
代码实现:c语言

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

int main (){
int p,q;
while(~scanf("%d %d",&p,&q)){
    int s=digui(p,q);
    printf("%d",s);
    printf("\n");
}

return 0;
}
int digui (int p,int q){
    if(p<q){
       if(q-p==1) return 1;
if(q-p==2) return 2;
  else {
    return digui(p,q-1)+digui(p,q-2);
  }
    }


}

F 骨牌覆盖

题目描述

用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:

输入

多组测试用例,每一组是一个正整数。

输出

每组输出占一行。
只需要输出铺放方案总数,不需要输出具体的铺放方案。

样例输入 Copy

3

样例输出 Copy

3
分析:和前面的题类似  此时的数都是前面 两个数的和
每一次长度为n的骨牌   它的最后一次填完  都可以看作两种填完  要么是  占一横格的 竖着
                                                                                                 要么是  占两横格的 横着
所以递归的话  就是   return  digui(n-2)+digui(n-1)
具体看代码实现
代码实现:c语言

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

int main (){
int n;
while(~scanf("%d",&n)){

    int z=digui(n);
    printf("%d",z);
    printf("\n");
}


return 0;
}


int digui(int n){
    if(n>0){
   if(n==1) return 1;
   if(n==2) return 2;
   if(n>2) return digui(n-1)+digui(n-2);
    }

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法分析设计是一门计算机科学中的重要课程,它主要研究的是如何设计分析各种算法。 首先,算法是解决问题的步骤和方法的描述。它是计算机程序的基础,可以帮助解决我们面临的各种复杂问题。算法设计是指选择适当的数据结构和算法来解决问题,同时优化算法的效率和性能。 算法分析是对算法运行时间和空间复杂度的估计和评估。这是课程中重要的一部分,因为在选择算法时,我们需要考虑其执行时间和占用的空间。在分析中,我们可以使用一些常用的技术和方法,如递归,迭代,分治法和动态规划等。 此外,算法分析设计课程还会介绍一些经典的算法和数据结构,如排序算法、搜索算法、图算法等。我们会学习它们的原理和实现方法,并进行实际的编程练习和实验。 在实际应用中,算法的选择和设计对程序的效率和性能至关重要。因此,通过学习算法分析设计,我们可以提高我们的编程技能和解决问题的能力。此外,它还可以为我们进一步学习更复杂的计算机科学领域和算法研究奠定坚实的基础。 总结来说,算法分析设计课程是一门重要的计算机科学课程,它帮助我们了解如何设计分析算法,提高我们的编程能力和解决问题的能力。通过学习该课程,我们可以更好地理解算法的原理和实现方法,并为进一步学习更复杂的计算机科学和算法领域打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值