[转]面试中遇到递归算法题别慌--常见递归算法题的解题思路
2011-02-20 16:29 雪夜&流星 阅读(573) 评论(0) 编辑 收藏 举报转载自:http://www.cnblogs.com/yzx226/archive/2011/02/20/RecursionAlgorithms.html
前几天在博客园看到有人面试时,遇到递归算法题,一时手痒就解了一个。顺便网上又找来几个,也实现了。给大家分享一下,开阔一下思路,没准你明天面试就能用上。
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)}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本