第1关:编写递归函数方法求x的n次方 (要求n>=0)
任务描述
本关任务:编写递归函数方法求x的n次方 (要求n>=0)。
相关知识
递归法
在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。
若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。
下面主要介绍直接递归。
一般地,递归模型由两部分组成,一部分为递归出口,它给出了递归的终止条件。另一部分为递归体,它确定递归求解时的递推关系。
例如:计算n阶乘的程序在数学上可以定义为:
则递归算法求n阶乘的伪代码为:
int fact(int n)
{
if(n == 0)
return 1;
else
return n * fact(n - 1);
}
上面例子中的f(0)=1就是递归出口; f(n)=n*f(n-1)就是递归体。
要注意一下两点:
递归调用的次数必须是有限的。
必须有结束递归的条件来终止递归。
递归算法求解过程的特征:
先将不能直接求解的问题转换成若干个相似的小问题,通过分别求解各子问题,最后获得整个问题的解。
当这些子问题不能直接求解时,还可以再将它们转换成若干个更小的子问题,如此反复进行,直到遇到递归出口为止。
这种自上而下将问题分解、求解,再自上而下引用、合并,求出最后解答的过程称为递归求解过程。这是一种分而治之的算法设计方法。
求x的n次方的求解过程可以写出递归定义:
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入: 2.3,5 预期输出: 64.363430
测试输入: 2.3,-5 预期输出: n<0,data error!
``
开始你的任务吧,祝你成功!
代码示例
#include <stdio.h>
double power(double x,int n)
{
/********** Begin **********/
if(n<0)
return 0;
else if (n==0)
return 1;
else if (n==1)
return x;
else
return x*power(x,n-1) ;
/********** End **********/
}
int main( )
{
int n;
double x, y;
scanf("%lf,%d",&x,&n);
y = power(x,n);
if(y!=0)
{
printf("%lf\n",y);
}
else
printf("n<0,data error!");
return 0;
}
第2关:编写递归函数求小于等于n的所有正整数之和
任务描述
本关任务:编写递归函数求小于等于n的所有正整数之和。
相关知识
略
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入: 10 预期输出: 55
提示: 1+2+3+4+5+6+7+8+9+10=55
开始你的任务吧,祝你成功!
代码示例
#include <iostream>
using namespace std;
int add(int n);
int main()
{
int n;
int b;
cin>>n;
b = add(n);
cout<<b<<endl;
return 0;
}
int add(int n)
{
/********** Begin **********/
if(n==1)
return 1;
else return n+add(n-1);
/********** End **********/
}
第3关:编写递归函数求数组元素的和
任务描述
本关任务:编写递归函数求数组从起始序号到结束序号之间数组元素的和。
相关知识
可以根据数组下标来设置递归执行的调用以及终止条件。 要计算数组a从起始序号start到结束序号end之间数组元素的和: (1)如果数组a起始序号start等于结束序号end,那么返回值为此序号数组元素值a[start]。 (2)如果数组a起始序号start小于结束序号end,那么返回值为a[start]与数组a从start+1到end的之间数组元素的和。
编程要求
根据提示,在右侧编辑器补充代码。编写递归函数求数组从起始序号到结束序号之间数组元素的和。
测试说明
平台会对你编写的代码进行测试:
测试输入: 10 91 1 2 3 9 5 4 6 8 7 2 6
预期输出: 23
输入提示: 第一行表示数组元素的个数 第二行输入数组元素的值 第三行表示数组起始序号 第四行表示数组结束序号
输出提示: 数组从起始序号到结束序号之间数组元素的和
开始你的任务吧,祝你成功!
代码示例
#include <stdio.h>
#define N 20
int Fun(int a[],int start,int end);
int main()
{
int a[N], sum;
int i,n,s,e;
//printf("输入整数个数:");
scanf("%d",&n);
//printf("输入%d个整数:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//printf("输入起始位数:");
scanf("%d",&s);
//printf("输入终止位数:");
scanf("%d",&e);
sum = Fun(a,s,e) ;
printf("%d\n",sum);
return 0;
}
/**********定义Fun()函数**********/
/********** Begin **********/
int Fun(int a[],int start,int end)
{
if(start==end)
return a[start];
if(start<end)
return
a[end]+Fun(a,start,end-1);
}
/********** End **********/
第4关:编写递归函数求数组元素的最大值
任务描述
本关任务:编写函数求一个数组中数组元素的最大值,要求必须用递归方法解决。
相关知识
可以根据数组下标来设置递归执行的调用以及终止条件。 要计算数组a从起始序号start到结束序号end之间数组元素的最大值: (1)如果数组a起始序号start等于结束序号end,那么返回值为此序号数组元素值a[start]。 (2)如果数组a起始序号start小于结束序号end,那么返回值为a[start]与数组a从start+1到end的之间最大值的最大值。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
输入样例: 5 92 18 77 6 15
输出样例: 92
输入格式: 数组中的数字均为整型数,输入的第一个数为数组长度,后续为数组的所有元素。
输出格式: 该数组的最大值
开始你的任务吧,祝你成功!
代码示例
#include <stdio.h>
#define N 20
int max(int a,int b);
int Func(int a[],int s,int e);
int main()
{
int a[N], m;
int i,n,s,e;
//printf("输入整数个数:");
scanf("%d",&n);
//printf("输入%d个整数:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
m = Func(a,0,n-1) ;
printf("%d\n",m);
return 0;
}
/**********定义Max()函数**********/
int max(int a,int b)
{
/********** Begin **********/
/********** End **********/
}
/**********定义Func()函数**********/
int Func(int a[],int s,int e)
{
/********** Begin **********/
if(s == e)
return a[s];
if(s < e)
return a[e]>Func(a,s,e-1)?a[e]:Func(a,s,e-1);
/********** End **********/
}
第5关:编写递归函数将所输入的整数以相反顺序打印
任务描述
本关任务编写递归函数将所输入的整数以相反顺序打印出来,整数为0时终止输入。
相关知识
递归函数也可以没有返回值,可以根据条件判断是否继续调用递归函数。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入: 4 31 57 2 0 预期输出: 2 57 31 4
开始你的任务吧,祝你成功!
代码示例
#include <stdio.h>
#include <iostream>
using namespace std;
const int N = 100;
int a[N];
void reverse(int l); //reverse函数的声明
int main()
{
int x, cnt = 0;
cin >> x;
a[cnt] = x;
while (x)
{
cin >> x;
a[++ cnt] = x;
}
reverse(cnt);
return 0;
}
/**********定义reverse ()函数**********/
void reverse(int l)
{
/********** Begin **********/
if (l == 0) return;
cout << a[l - 1] << ' ';
reverse(l - 1);
/********** End **********/
}
第6关:编写递归函数将所输入的5个字符,以相反顺序打印
任务描述
本关任务:编写递归函数将所输入的5个字符,以相反顺序打印出来。
相关知识
本关任务与上关任务相比,要处理的数据类型从数值型变成了字符型。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入 abcde 预期输出: edcba
开始你的任务吧,祝你成功!
代码示例
#include <stdio.h>
void func(int n);
int main()
{
//printf("please input 5 numbers:");
func(5);
return 0;
}
/**********定义func ()函数**********/
void func(int n)
{
char next;
if(n<=1)
{
next=getchar();
putchar(next);
}
else
{
next=getchar();
func(n-1);
putchar(next);
}
}