面试中遇到递归算法题别慌--常见递归算法题的解题思路

前几天在博客园看到有人面试时,遇到递归算法题,一时手痒就解了一个。顺便网上又找来几个,也实现了。给大家分享一下,开阔一下思路,没准你明天面试就能用上。

 

1、编写一个方法用于验证指定的字符串是否为反转字符,返回true和false。请用递归算法实现。(反转字符串样式为"abcdedcba")

2、一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30个是多少

3、一列数的规则如下: 1、12、123、1234、12345、123456......,求第n个数的递归算法(n<=9)。
4、将一整数逆序,如987654321变为123456789。

5、一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?

以上的前提:不能用数组 或转成字符串处理,也不能用内置函数,如C#的幂函数(Math.Pow)

 

 

递归算法很有意思的,并不是说函数调用自身就一定是递归算法。有一次我做面试官,有一童鞋在一道简单的递归函数中,还用到了for循环,当场被我Pass(当然还有其他因素)

 

总结一下递归算法的解题思路:

首先步骤分解,写出最后一次递归(n=1)的计算公式,然后是倒数第二次(n=2),n=3....,最后归纳出递归算法

如第二题:fn(1)=1;f(2)=1;f(3)=f(1)+f(2);----> f(n)=f(n-2)+f(1),那么很容易就写出这个递归函数

f(n)={n<=2?1:fn(n-2)+f(n-1)}

再如第五题:
设f()=0,是一次失败的组合,f()=1是一次成功的组合
f(n,sum),n:轮次,sum:本轮及本轮之后应打中的总环数
f(1,sum),sum<0||sum>10,则返回0;
                sum<=10,这说明最后一枪只要打中sum环,就能满足题设,返回1,即一次组合情况
f(2,sum),sum<0||sum>20,则返回0;
                sum==20,这说明最后两枪只要打都中10环,就能满足题设,返回1
                sum<20,如果倒数第二枪打中x环[0,10],最后一枪打中sum-x环,也就能满足题设,返回1
注意这里,上一句就可以描述为当本轮打中x环的情况下,会几轮能打中sum-x环会用多少种情况,也即f(n-1,sum-x)种情况
我这个递归算法中,还可以加上一个数组参数用来记录前几轮的中靶情况,这样就能打印出每种组合
在递归算法中,当递归层次很深时,要考虑空间复杂度,尽量减少新变量,所以我的算法中,多用了ref方式。在面试可以忽略这种情况,加快解题速度。
另外,多数递归算法都可以拆解成非递归的循环算法,因为这样会减少递归函数的入栈出栈。在实际运用中,要综合考虑运行工况(CPU、内存、算法被调用的频度,递归层数等),也就是空间与时间的取舍。
以上为个人观点,请各位指教。

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值