程序员面试宝典笔记3-循环递归与概率

本文探讨了程序员面试中常见的递归和循环问题,包括如何实现字符串长度统计的递归函数,以及解决从A到B的最短路径数的递归策略。此外,还涉及到了螺旋队列问题和概率递归的基础概念,同时提供了递归算法的设计实例,如x(x(8))的调用次数分析。文章通过具体的代码示例和逻辑解析,帮助读者深入理解这些核心概念。
摘要由CSDN通过智能技术生成

程序员面试宝典笔记3-循环递归与概率

递归基础

面试例题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)==0f(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;
	}
};

答案中所说的二叉树其实就是调用图。
在这里插入图片描述

循环与数组问题

螺旋队列问题

概率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值