算法设计与分析2023秋-头歌实验-实验一 循环与递归

第1关:从自然数中取3个数进行组合之循环算法

任务描述

本关任务:用循环算法找出 5 个自然数中取 3 个数的组合。

编程要求

请在右侧编辑器Begin-End处补充代码,完成本关任务。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:5 3 (n=5,r=3;,表示从1,2,3,4,5自然数中选择 3 个数)
预期输出:

1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

参考答案

#include <stdio.h>

void combloop1(int n, int r)
{
    /**********  Begin  **********/

    for(int i=1;i<=n;i++){
        for(int j=2;j<=n;j++){
            for(int k=3;k<=n;k++)
            if((i<j)&&(j<k)){
                printf("%d %d %d",i,j,k);
                printf("\n");
            }
        }
    }

    /**********  End  **********/
}

void main()
{
    int n,r;
    scanf("%d%d",&n,&r);
    combloop1(n,r);
}

第2关:从自然数中取3个数进行组合之递归算法

任务描述

本关任务:用递归算法找出 5 个自然数中取 3 个数的组合。

编程要求

请在右侧编辑器Begin-End处补充代码,完成本关任务。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:5 3 (n=5,r=3;,表示从1,2,3,4,5自然数中选择 3 个数)
预期输出:

5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1

参考答案

#include <stdio.h>
int a[100];
void combrecur(int n, int r)
{
    /**********  Begin  **********/
    int i,j;
    for(i=n;i>=r;i--){ 
        a[r]=i;
        if(r>1){
            combrecur(i-1,r-1);
        }
        else{
            for(j=a[0];j>0;j--){
                printf("%d",a[j]);
                printf(" ");
            }
            printf("\n");
        }
    }
 
    /**********  End  **********/
}
 
void main()
{
    /**********  Begin  **********/
    int n,r;
    scanf("%d %d",&n,&r);
    if(n>r){
        a[0]=r;
        combrecur(n,r);
    }
    /**********  End  **********/
}

第3关:求n的阶乘n!

任务描述

本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。

编程要求

请在右侧编辑器Begin-End处补充代码,完成本关任务。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:10
预期输出:

递归算法求得10! = 3628800 
循环算法求得10! = 3628800

参考答案

#include <stdio.h>
int s=1;
float fac_recursion(int n)
{
    /**********  Begin  **********/
if(n==1)
return 1;
else
return n*fac_recursion(n-1);
 
 
	/**********  End  **********/
}
 
float fac_loop(int n)
{
    /**********  Begin  **********/
for(int i=n;i>=1;i--){
s*=i;
}
return s;
 
	/**********  End  **********/
}
 
void main()
{
    int n;
    float y;
    scanf("%d",&n);
    y=fac_recursion(n);
    printf("递归算法求得%d! = %.0f \n",n,y);
    y=fac_loop(n);
    printf("循环算法求得%d! = %.0f \n",n,y);
}

第4关:求斐波那契额数列的前10项

任务描述

本关任务:用循环和递归算法求斐波那契额数列的前 10 项。

编程要求

请在右侧编辑器Begin-End处补充代码,完成本关任务。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:10
预期输出:

递归算法求的前10项为:  1  1  2  3  5  8 13 21 34 55
循环算法求的前10项为:  1  1  2  3  5  8 13 21 34 55

参考答案

#include <stdio.h>
int fibo_recur(int n)
{
    /**********  Begin  **********/
    if(n==1||n==2)
    return 1;
    else
    return fibo_recur(n-1)+fibo_recur(n-2);
    /**********  End  **********/
}
 
int fibo_loop(int n)
{
    /**********  Begin  **********/
    int a=1,b=1,c;
    if(n<=2)
    return a;
    else
    {
        for(int i=3;i<=n;i++){
            c=a+b;
            a=b;
            b=c;
        }
        return c;
    }
    /**********  End  **********/
}
 
void main()
{
    int n,y,i;
	scanf("%d",&n);
	printf("递归算法求的前10项为:");
	for(i=1; i<=n; i++)
	{
       y=fibo_recur(i);
       printf("%3d",y);
	}
    printf("\n循环算法求的前10项为:");
	for(i=1; i<=n; i++)
	{
       y=fibo_loop(i);
       printf("%3d",y);
	}
}
posted @ 2023-12-18 22:11  明金同学  阅读(102)  评论(0)    收藏  举报  来源