C语言递归练习
2024-09-05 23:50:53
1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。
int CannonBall(int h)
{
if(h == ) return ;
else
return CannonBall(h-) + pow(h,);
} int main(void)
{
printf("%d\n",CannonBall());
return ;
}
C代码
2、使用C编写一个指数函数,实现n^k
int RaiseToPower(int n, int k)
{
if(k == )
return ;
else
return n * RaiseToPower(n,k -);
} int main()
{
printf("%d\n",RaiseToPower(,));
return ;
}
C代码
3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.
int gcd(int m, int n)
{
if(m % n ==)
return n;
else
return gcd(n,m % n);
} int main()
{
printf("%d\n",gcd(,));
return ;
}
C代码
4、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
int DigitSum(int n)
{
if(n < )
return n;
else
return ((n % ) + DigitSum(n / ));
} int main()
{
printf("%d\n",DigitSum());
return ;
}
C代码
5、整数n的数字根是如下定义的:它是一个整数的所有数字的和,反复相加,直到只剩下一位数字为止。例如:1729的digital root按照如下的步骤计算:
step 1: 1+7+2+9 -----> 19
step 2: 1+9 -----> 10
step 3: 1+0 ------> 1
因为第三步的结果是1,所以1就是数字根的值。
写一个函数DigitalRoot(n),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。
int DigitSum(int n)
{
if(n < )
return n;
else
return ((n % ) + DigitSum(n / ));
} int DigitalRoot(int n)
{
if(n < )
return n;
else
return DigitalRoot(DigitSum(n));
} int main()
{
printf("%d\n",DigitalRoot());
return ;
}
C代码
6、计算组合数C(n,k)
int Comb(int n, int k)
{
if(k == || n == k)
return ;
else
return (Comb(n - ,k - ) + Comb(n - ,k));
} int main()
{
int i;
for(i = ; i <= ; i++)
{
printf("%d ",Comb(,i));
}
printf("\n");
return ;
}
C代码
7、将一个整数作为字符串打印
#include<stdio.h> void printd(int n)
{
if(n < ) {
putchar('-');
n = -n;
}
if(n / )
printd(n / );
putchar(n % + '');
} int main()
{
int a = ;
printd(a);
printf("\n");
return ; }
C代码
8、运用上面printd函数的设计思想编写一个递归版本的itoa函数,即通过递归函数把整数变为字符串
#include<stdio.h> void itoa(int n, char *s)
{
static int i;
if(n / )
itoa(n / , s);
else {
i = ;
if(n < )
s[i++] = '-';
}
s[i++] = abs(n) % + '';
s[i] = '\0';
} int main()
{
char s[];
int n = ;
itoa(n, s);
printf("%s\n",s);
return ; }
C代码
9、编写一个递归版本的reverse(s)函数,以将字符串s转置
#include<stdio.h> void reverser(char *s, int i, int len)
{
int c, j;
j = len - (i + );
if(i < j) {
c = s[i];
s[i] = s[j];
s[j] = c;
reverser(s, ++i, len);
}
} void reverse(char *s)
{
int len;
len = strlen(s);
reverser(s, , len);
} int main()
{
char s[];
gets(s);
reverse(s);
printf("%s\n",s);
return ;
}
C代码
最新文章
- <;JavaScript语言精粹>;--<;读书笔记三>;之replace()与正则
- JavaScript深入浅出6-函数和作用域
- PDO预处理
- android Activity生命周期(设备旋转、数据恢复等)与启动模式
- 【Git】笔记1
- python的中文编码问题
- JavaScript函数绑定
- SharePoint 2013 Nintex Workflow 工作流帮助(十一)
- .NET Async/Await 最佳实践
- 聚焦 SQL 数据库活动异地复制
- Android 读取手机某个文件夹目录及子文件夹中所有的txt文件
- AngularJS实现表单手动验证和表单自动验证
- Mac下配置node.js环境(Mac 10.12)
- 剥掉层层外衣后的RPC是什么样子的?
- Java学习导航
- UITextField属性及方法说明
- java.lang.NumberFormatException 错误及解决办法
- Windows添加用户和组命令
- vm参数配置的理解
- 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐