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

简介: 前几天在博客园看到有人面试时,遇到递归算法题,一时手痒就解了一个。顺便网上又找来几个,也实现了。给大家分享一下,开阔一下思路,没准你明天面试就能用上。1、编写一个方法用于验证指定的字符串是否为反转字符,返回true和false。

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

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)

复制代码
 1 using System;
2
3  namespace RecursionAlgorithms
4 {
5 class Program
6 {
7 private static bool fn1(ref string str, ref int from, ref int to)
8 {
9 if (from >= to) return true;
10 if (str[from++] != str[to--]) return false;
11 return fn1(ref str, ref from, ref to);
12 }
13 private static int fn2(int i)
14 {
15 return i <= 2 ? 1 : fn2(i - 2) + fn2(i - 1);
16 }
17 private static long fn3(long x, ref long n)
18 {
19 return (x <= 1) ? x : fn3(x - 1, ref n) + x * (n *= 10);
20 }
21 private static long fn4(long x, ref long n)
22 {
23 return (x < 10) ? x : fn4(x / 10, ref n) + (x % 10) * (n *= 10);
24 }
25 private static long fn5(int n, int sum)
26 {
27 if ((n == 1 && sum <= 10) || (sum == n * 10)) return 1;
28 if (sum > n * 10 || sum < 0) return 0;
29 long ok = 0;
30 for (int i = 0; i <= 10; i++)
31 {
32 ok += fn5(n - 1, sum - i);
33 }
34 return ok;
35 }
36
37 static void Main(string[] args)
38 {
39 string[] strs = { "", "a", "aa", "aba", "abba", "abcba", "ab", "abc", "abca" };
40 for (int i = 0; i < strs.Length; i++)
41 {
42 string str = strs[i];
43 int from = 0, to = str.Length - 1;
44 Console.WriteLine("{0} is {1}", str, fn1(ref str, ref from, ref to));
45 }
46 for (int i = 1; i <= 30; i++) Console.Write("{0}:{1} \t", i, fn2(i));
47 long n = 1, m = 1, t = 0;
48 for (int i = 0; i <= 9; i++, n = m = 1)
49 {
50 Console.Write("\n {0} ==> {1}", t = fn3(i, ref n), fn4(t, ref m));
51 }
52 Console.WriteLine("\n{0}种可能性", fn5(10, 90));
53 }
54 }
55 }
复制代码

测试一下:

递归算法很有意思的,并不是说函数调用自身就一定是递归算法。有一次我做面试官,有一童鞋在一道简单的递归函数中,还用到了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(n,sum),n:轮次,sum:本轮及本轮之后应打中的总环数,返回值0代表一次失败的组合,返回值大于0则代表满足题设情况的组合数量。
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环,也就能满足题设,成功情况累加
注意这里,上一句就可以描述为:当本轮打中x环的情况下,后几轮能打中sum-x环的情况能有几种,也即f(n-1,sum-x)种情况
我这个递归算法中,还可以加上一个数组参数用来记录前几轮的中靶情况,这样就能打印出每种组合
 
 
在递归算法中,当递归层次很深时,要考虑空间复杂度,尽量减少新变量,所以我的算法中,多用了ref方式。在面试可以忽略这种情况,加快解题速度。
 
另外,多数递归算法都可以拆解成非递归的循环算法,因为这样会减少递归函数的入栈出栈。在实际运用中,要综合考虑运行工况(CPU、内存、算法被调用的频度,递归层数等),也就是空间与时间的取舍。
 
以上为个人观点,请各位指教。各位在面试中遇到过什么递归算法题,也请贴上来,大家讨论一下解题思路。
 

本文同时发表在CSDN:http://blog.csdn.net/yzx226/archive/2011/02/20/6195999.aspx

目录
相关文章
|
7月前
|
算法 搜索推荐 C#
C# 面试常见递归算法
C# 面试常见递归算法
|
算法 C++
【每日算法Day 103】老题新做,几乎不会有人想到的解法,它来了
【每日算法Day 103】老题新做,几乎不会有人想到的解法,它来了
105 0
|
算法 C++
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
110 0
|
机器学习/深度学习 算法
算法刷题第十天:递归 / 回溯--1
时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。
91 0
算法刷题第十天:递归 / 回溯--1
|
存储 测试技术
Leetcode | 从斐波那契数聊递归
Leetcode | 从斐波那契数聊递归
105 0
Leetcode | 从斐波那契数聊递归
|
人工智能 算法 大数据
终于有人把面试必考的动态规划、链表、二叉树、字符串全部撸完了
对于计算机专业的毕业生而言,算法岗基本上就是**「高薪」**的代名词。 然而,由于这几年AI方向异常火爆,算法岗似乎也已经承载不下了,计算机视觉就是一个很好的例子,某些公司的录用比例已经达到了**32:1**。 知乎上的问题也从**「是否值得进入」**到**「供大于求」**再到**「诸神黄昏」**、**「灰飞烟灭」**、**「车毁人亡」**,一年比一年夸张。
109 0
终于有人把面试必考的动态规划、链表、二叉树、字符串全部撸完了
|
存储 算法 索引
数据结构与算法(二叉搜索树)~ 介绍二叉搜索树以及力扣上几道二叉搜索树题目的方法和套路
数据结构与算法(二叉搜索树)~ 介绍二叉搜索树以及力扣上几道二叉搜索树题目的方法和套路
126 0
数据结构与算法(二叉搜索树)~ 介绍二叉搜索树以及力扣上几道二叉搜索树题目的方法和套路
|
算法 Java
数据结构与算法(二叉树)~ 介绍二叉树以及力扣上几道二叉树题目的方法和套路
数据结构与算法(二叉树)~ 介绍二叉树以及力扣上几道二叉树题目的方法和套路
89 0
数据结构与算法(二叉树)~ 介绍二叉树以及力扣上几道二叉树题目的方法和套路
|
存储 缓存 算法
面试官问我斐波拉契数列,我从暴力递归讲到动态规划 ...
面试官问我斐波拉契数列,我从暴力递归讲到动态规划 ...