递归基础
面试例题1:递归函数 mystrlen(char *buf, int N) 是用来实现统计字符串中第一个空字符前面字符长度。请实现这个函数:
举例:char buf[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z' };
字符串buf ,当输入N=10 或者 20, 期待输出的结果是6;当输入N=3 或 N=5,期待输出结果是 3 或 5;
解析:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;
int mystrlen(char *buf, int N)
{
// 递归终止条件
if (buf[0]==0 || N == 0)
return 0; //如果空字符出现,返回-0;
else if (N == 1)
return 1; //如果字符长度为 1, 返回 1
// 递归语句
int t = mystrlen(buf, N / 2); //折半递归去长度
if (t < N / 2)
return t; //如果长度小于输入N值得一半,取当前长度
else // 反之去下面一个字符并继续递归
return (t + mystrlen(buf + N / 2, (N + 1) / 2));
}
int main()
{
char buf[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z' };
int k;
k = mystrlen(buf, 20);
cout << k << endl;
k = mystrlen(buf, 5);
cout << k << endl;
system("pause");
return 0;
}
面试例题2:求从 A 到 B 的最短路径数,要求:不可以穿过灰色区域。
解析:
出发后只能 向下走或向右走,任何 向上或向左 都会增加路径长度;
- 无阻碍的情况为:
假设在任意M,N的这种格子上,从左上A出发到右下B的不同走法有f(M,N)
种,则根据递推可知f(M, N)=f(M-1, N)+f(M, N-1)
,等号右边两项分别对应 向下走一步 和 向右走一步 的情况。
递归终止条件是f(M,0)==f(0,N)==0
和f(1,1)==1
。 - 有阻碍的情况为:
典型递归问题
面试例题1:设计递归算法 x(x(8))
需要调用几次 x(int n)。
class Program
{
static void Main(string[] args)
{
int i;
i = x(x(8));
}
static int x(int n)
{
if (n <= 3)
return 1;
else
return x(n - 2) + x(n - 4) + 1;
}
};
答案中所说的二叉树其实就是调用图。