日期:2014-05-18  浏览次数:20454 次

求助 简单的递归算法
一组数的规则如下:1、1、2、3、5、8、13、21、34.....,求第30位数是多少?用递归方式实现

另外还有两个面试题,求解答。
1、A说B说谎,B说C说谎,C说A、B说谎,请问到底谁说谎?
2、有一个三升的水杯和一个五升的水杯,如何倒四升的水?

智商拙计 真心求帮助 万分感谢!

------解决方案--------------------
第一题是斐波那契数列
int Fibonacci(int n)
{
 if( n == 1 || n == 2) // 递归结束的条件,求前两项
return 1;
 else
return Fibonacci(n-1)+Fibonacci(n-2); // 如果是求其它项,先要求出它前面两项,然后做和。
}
第二题最笨的方法是三个for循环遍历
第三题是
方法一 
1.用3升的容器接满水,倒入5升容器中。 
2.再用3升的容器接满,倒入5升容器中。此时3升容器中还剩下1升水。 
3.将5升容器中的水倒掉,将3升容器中剩下的1升水倒入5升容器。 
4.再将3升容器接满水倒入5升容器中,此时5升容器中就是4升水。 

方法二 
1.用5升的容器接满水,倒入3升容器中。此时5升容器中有2升水。 
2.将3升容器中的水倒掉,在将5升容器中剩下的水倒入3升容器中。此时3升容器中有2升水。 
3.将5升容器接满水,把水再倒入3升容器中至满。此时5升容器中剩4升水。
------解决方案--------------------
一组数的规则如下:1、1、2、3、5、8、13、21、34.....,求第30位数是多少?用递归方式实现

------
这些网上都有现成的答案 都是以前面试的题目 论坛也有 搜下

1、A说B说谎,B说C说谎,C说A、B说谎,请问到底谁说谎?
2、有一个三升的水杯和一个五升的水杯,如何倒四升的水?

1.C说谎了
2.好像要来回倒几次

--------------------- 这面试题目真没什么价值 网上泛滥答案

------解决方案--------------------
菲波拉切数列,稍微知识面广一点的中学生都应该知道。

这个数列有一个有趣的性质,就是前一项/后一项逼近0.618黄金分割。
------解决方案--------------------
1、A说B说谎,B说C说谎,C说A、B说谎,请问到底谁说谎?

if a 说谎, then b 不说慌, then c 说谎, then a or b 不说谎, 不矛盾
if a 不说谎, then b 说谎, then c 不说谎, then a and b 说谎, 矛盾

所以a,c说谎

分析不难,但想用prolog编个程序,请高人教我,谢谢!

------解决方案--------------------
既然prolog编不来,尝试用c#编,开始觉得不难,可是昨天搞了一下午,仍然有bug,今天又搞了一会,总算初步能工作了,代码又臭又长,只不过花了不少时间写的,敝帚自珍吧。如果有高手指导我改进或者给出更好的思路,不胜感激!

C# code

private void button1_Click(object sender, EventArgs e) //做了个win form程序
{
                //这里用xml来表示,p表示人, islie取值为t (表示说谎) 或者 f(表示没说谎)
                //say表示这个人说的话。"!b" 表示'b说谎',"b" 表示'b没说谎', "!a, !b"
                //表示'a, b都说谎', "!a;!b"表示'a或者b说谎',余类推。规定不能用!,;三
                //种符号结尾
                string xml = "<Data>"
                    + "<p name='a' islie='' say='!b' isset='0' />"
                    + "<p name='b' islie='' say='!c' isset='0'  />"
                    + "<p name='c' islie='' say='!a,!b' isset='0'  />"
                    + "</Data>";

                XDocument xdoc = XDocument.Parse(xml);
                var item = xdoc.Descendants("p").FirstOrDefault();
                //任一人只有两种可能,说谎或者不说谎,因此任取1人足矣
                    if (String.IsNullOrEmpty(item.Attribute("islie").Value))
                    {
                        item.SetAttributeValue("islie", "f");//假设该人没说谎
                        if (isLie(item) == false)
                        {//若返回false,说明假设错误
                            foreach (var item2 in xdoc.Descendants("p"))
                            {//复位
                                item2.SetAttributeValue("islie", "");
                                item2.SetAttributeValue("isset", "0");
                            }
                            item.SetAttributeValue("islie", "t");//重新假设
                            if (isLie(item) == false)
                            {//说明无解
                                displayAnswer(item, false);
                                break;
                            }
                            else
                            {
                                displayAnswer(item, true);
                                break;
                            }
                        }
                        else
                        {
                            displayAnswer(item, true);
                            break;