递归函数大练兵



练习1:实现1+2+3+4+100的递归函数,recursion:递归

int  recursion(int n)
{
if (n==1)
{
return 1;//如果n==1,recursion(1)等于1
}
else{


return recursion(n-1)+n;//递归运算
}
}
void main200()
{
printf("\n%d", recursion(100));
system("pause");
}


练习2:函数递归,阶乘factorial

int  factorial(int num)
{
if (num == 1)
{
return 1;
}
else{
return num*factorial(num - 1);
}
}
void main201()
{
printf("\n阶乘结果为=%d",factorial(3));
system("pause");
}

练习3 将10进制数据转换成二进制数据

将10进制数据转换成二进制数据 10->1010,原理即使不断除以2取出余数,不能用循环来实现,因为循环是正序排列,递归是逆序排列。大家思考一下,我们也可以用栈来逆序排列,实现递归所实现的东西


int  tenTotwo(int num)
{
if (num==0)
{
return;
}
else{

tenTotwo(num/2);//调用函数,取整除以2
printf("%d", num % 2);
/*
如果printf("%d",num%2);在上面,结果就是正序,不是逆序
printf("%d",num%2);
tenTotwo(num/2);

*/

}

}

void main261()

{
int num;
scanf_s("%d",&num);
printf("你要转换的十进制数是%d\n",num);
printf("转换以后的二进制数是");
tenTotwo(num);
system("pause");
}



void tenTotwo(int n)//tenTotwo:十进制转二进制,n转换为二进制
{
if (n==0)//递归的标准形式
{
                                      //n=0的情况下,没有必要继续
}
else{
int m = n % 2;//取出余数
//printf("%d", m);//放在前面,递归调用之前,就是顺序,否则就是逆序
tenTotwo(n / 2);//用递归的方式调用,不断除以2
printf("%d",m);//递归调用之后实际上就是逆序
}
}

void main202()
{
tenTotwo(89);
system("pause");
}

练习4 腾讯面试题,

任何循环都可以转换成递归,但是递归不能转换循环。
楼梯有50阶,一次可以走一步,也可以走两步,问:从0走到50有多少种可能。
思考:1: 一个台阶有几种可能:1 ,1,一种可能
                 2:两个台阶有几种可能:11,2,两种可能
                 3:三个台阶有几种可能:111,12,21,3种可能
                 4:四个台阶有几种可能:1111,121,112,221,22,5种可能

走50台阶有两种可能,要不从48走上来,要不从49走上来;要从49走上来,得要从47,48走上来。总结:我走到50步的可能,是走48和49的可能之和, 腾讯在这里有一个坑,要是数字是50,结果会很大,溢出了,换成doule

double tencent(int num)
{
if (num==1)//等于1的时候,返回一个台阶
{
return 1.0;
}
else if (num==2)
{
return 2.0;
}
else{
return tencent(num - 1) + tencent(num-2);
}
}
void main203()
{     
printf("ok=%d", tencent(10));
system("pause");
}

练习6:汉诺塔递归算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值