我在北京找工作(四):java实现递归<1> 一些笔试题+常见算法

今天北京下了一场雨,半夜电闪雷鸣的,又有多少人胆战心惊了呢。

递归:递归过程的执行总是一个过程体未执行完,就带着本次执行的结果进入到另一轮过程体的执行中……如此反复,不断深入,直到某次过程的执行遇到终止递归调用的条件成立时,则不再深入,而执行本次的过程体余下的部分,然后返回到上一次调用的过程体中,执行余下的部分……如此反复,直到回到起始位置上,得到相应的程序运行结果。
可以说,递归过程的程序设计的核心思想就是参照这种执行流程,设计出一种适合“逐步深入,而后又逐步返回”的递归调用模型,以解决实际的问题!

分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之
三个步骤:
step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
step3 合并:将各个子问题的解合并为原问题的解。

 

No1:斐波那契数列(Fibonacci数列)

问题描述:一个数列,当n=01时,Fn=1;当n>1时,Fn=Fn-1+Fn-2);示例如:11235813……
问题分析:这是一个可以用简单的递归方程式解决的问题。通过这个数列的规律,即可马上得到这个数列的递归关系式,我们先定义Fn)为该数列中下标为n的那个数的值。

 

1-1

显而易见地可以看出该数列存在的原问题的子问题。当自变量为某一个值时,所求结果能为一个固定数值,则可看做一个递归的出口,当自变量为某一值时,结果为由比原问题更简单的子问题组成,并且子问题的性质与原问题相同,只是规模更小,在此递归求解。最后程序到达出口处完成输出即为原问题的解。

参考答案:原问题Fn)为斐波那契数列的第n个数的值;
         子问题为当n>1时,Fn=Fn-1+Fn-2);
                             n=01时,Fn=1
                递归出口为F0=F1=1

注意:(最好给出递归关系式,就是上图1-1那种形式的方程式。然后三要素:原问题用什么表示、子问题的划分、最后要给出函数终止的条件)

 

No2:汉诺塔问题

问题描述:从1n编号的盘子,其编号越大则盘子的大小越大。有三根柱子A,B,C,盘子能放在柱子上,并且只能是小盘子放在大盘子之上。汉诺塔问题正是求解如何将n个盘子从A柱借助B柱子移动到C柱。

问题分析:这是一个典型的适用递归描述的问题。通过分析,我们可以知道,原问题可以描述为Fstart_panziend_panzistart_zhuzi, center_zhuzi, end_zhuzi),翻译为:

F(最小的盘号,最大的盘号,原先所在的柱子,能够借助的柱子,最终要移动到的柱子)

F1,3ABC)为把从1号到3号盘子,从A柱借助B柱移到C柱。

我们能够发现现在我们就能把原问题划分成3个步骤完成,先把从1n-1个盘子从A借助C移动到B,再把第n个盘子直接移动到C,最后把从1n-1个盘子从B借助A移动到C即可。

1-2

 

参考答案:原问题Fspepszczez)为将编号从spep的所有盘子从sz柱,借助cz柱,移动到ez柱。

                子问题为将原问题划分为3个步骤来完成:第一步将最后一个盘子不动,即将spep-1号的盘子从sz柱借助ez暂时放到cz中间柱,再把第ep个盘子直接从sz放到ez柱上去,最后再把放在中间柱cz上的spep-1盘从cz借助sz移动到ez就完成了。

                递归出口为当问题中只有一个盘子的时候就只需要将该盘从所在柱子直接放到目标柱子(即子问题拆分的第2步)。

                注:最好写出上图1-2中的递归关系式。

 

总结:解决递归问题,只需分析得出原问题+子问题+递归出口。如果在能写出递归关系式的情况下,尽量给出,递归关系式能言简意赅的让别人明白拆分步骤,而且能直接简单的转换为相对应的代码。

 

1:二分搜索问题

参考答案:原问题为Searchlowhighnum)在已排序的数组下标为lowhigh之间寻找num元素。默认为从小到大的有序数组。

                子问题划分为首先取lowhigh最中间的那个元素,即下标为center=low+high/2的元素记为mmp,如果等于num则返回表示已找到,如果mmp<num则向右区间搜索(center+1high之间),如果mmp>num则向左区间搜索(lowcenter-1之间)。

                递归出口为mmp==num的时候表示已找到,则正常退出。还有当遍历整个数组还没有找到则退出,表示该数组中并没有num这个数。

递归关系式:图1-3

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 把一个链表反向,归,非归都写一遍。 1.试编写3个函数实现   (1)建立一个双向链表   (2)插入一个节点   (3)删除一个节点 2.自己定义数据结构,写出程序:二叉树的前序遍历。 3.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。 4.下面哪种排序法对12354最快 a quick sort b.buble sort c.merge sort 5.哪种结构,平均来讲,获取一个值最快 a. binary tree b. hash table c. stack 6.一个二叉树的三种遍历方法的输出结果 7.链表按升序打印每打印完一个节点就将该节点从链表中删除 8.选择一种算法来整理出一个链接表。你为什么要选择这种方法?现在用o(n)时间来做。 9. 用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。    10.给两个变量,如何出一个带环单链表中是什么地方出现环的? 11.哈希表和数组的定义,区别,优缺点。 12.链接表和数组之间的区别是什么? 任选一门语言,当场定义二叉排序树数据结构,写出两个函数:初始化,删除一个节点,20分钟 13. 归的折半查算法[不限语言] 14. 解释一下什么是B+树,如何实现B+树的查和插入.(用图示) 15.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。 13.排序方法比较 (intel) 排序方法 平均时间 最坏时间 辅助存储 直接插入排序 O(N2) O(N2) O(1) 起泡排序 O(N2) O(N2) O(1) 快速排序 O(Nlog2N) O(N2) O(Nlog2N) 简单选择排序 O(N2) O(N2) O(1) 堆排序 O(Nlog2N) O(Nlog2N) O(1) 归并排序 O(Nlog2N) O(Nlog2N) O(n) 基数排序 O(d(n+radix)) O(d(n+radix)) O(radix) 17.一个链表的操作,注意代码的健壮和安全性。要求: (1)增加一个元素; (2)获得头元素; (3)弹出头元素(获得值并删除)。 18.内排序算法 19.折半查的复杂度,证明 20.sizeof()和strlen()的使用. 21.顺序存储结构的优点,散列法的思想是什么? 22.汉罗塔算法,不能归... 23.一个链表的结点结构 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel) (2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表 依然有序。 (3)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表 依然有序,这次要求用归方法进行。 ( Autodesk) 24.编最优化Bubble(int *pIntArray,int L),要求:交换元素不能用临时变量,如果有序需要最优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值