代码改变世界

一个简单的递归面试题

2011-03-10 16:50  音乐让我说  阅读(699)  评论(0编辑  收藏  举报

这几天,一直都在找工作,一直都在笔试面试,其中也遇到很多笔试题目,大多都记不清楚了,应该不是很难。

下面分享一个公司给我出的机试题目:要求当m<n时,利用递归实现 m + (m+1) + (m+2) + ... + n

并要求用控制台程序实现,并且当用户输入的参数错误时,提示用户是否要重新输入。

想了一会,写出了如下代码:

/*
=============================================================================
作者:音乐让我说
代码描述:一个简单面试题,要求当m<n时,利用递归实现 m + (m+1) + (m+2) + ... + n
谢谢您的支持,欢迎您的转载,转载时请注明,谢谢!
=============================================================================	
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TempConApp
{
    class Program
    {
        static void Main(string[] args)
        {
            bool isContinue = true;
            do
            {
                Console.WriteLine("\n=======================================================\n");
                bool failedIsContinued;
                long num1;
                if (!GetUserInputNum(1, out num1, out failedIsContinued))
                {
                    isContinue = failedIsContinued;
                    continue;
                }
                long num2;
                if (!GetUserInputNum(2, out num2, out failedIsContinued))
                {
                    isContinue = failedIsContinued;
                    continue;
                }
                if (num1 >= num2)
                {
                    Console.Write("第 1 个数字必须小于第 2 个数字!");
                    isContinue = GetFailedIsContinued();
                    continue;
                }
                long result = GetResult(num1, num2);
                Console.WriteLine("结果为:" + result);
                
            } while (isContinue);
            Console.WriteLine("程序运行完毕!");
            Console.ReadKey();
        }

        /// <summary>
        /// 利用递归,得到从第一个数字到第二个数字之间所有数的总和(最后的总和包括第一个数和第二个数)
        /// </summary>
        /// <param name="beginNum">第一个数</param>
        /// <param name="endNum">第二个数</param>
        /// <returns></returns>
        static long GetResult(long beginNum, long endNum)
        {
            if (beginNum >= endNum)
            {
                return beginNum;
            }
            return endNum + GetResult(beginNum, endNum - 1);
        }

        /// <summary>
        /// 得到用户输入的数字
        /// </summary>
        /// <param name="serialNum">数字编号,表明这是输入的第几个数字,第一个调用该方法,传入 1 </param>
        /// <param name="outputNum">返回的值</param>
        /// <param name="failedIsContinued">转换失败后,是否要继续</param>
        /// <returns>返回用户输入的是否是数字,如果是,则返回 true </returns>
        static bool GetUserInputNum(int serialNum, out long outputNum, out bool failedIsContinued)
        {
            bool returnFlag = true;
            failedIsContinued = true;
            Console.Write("请输入第 " + serialNum + " 个数字:");
            string strNum = Console.ReadLine();
            if (!long.TryParse(strNum, out outputNum))
            {
                //转换失败
                returnFlag = false;
                Console.Write("您输入的第 " + serialNum + " 个数字错误!");
                failedIsContinued = GetFailedIsContinued();
            }
            return returnFlag;
        }

        /// <summary>
        /// 当失败后,获取用户是否想要继续
        /// </summary>
        /// <returns></returns>
        static bool GetFailedIsContinued()
        {
            Console.Write("是否继续重新输入?(y/n) :");
            string isContinueWord = Console.ReadLine();
            if (!string.Equals(isContinueWord, "Y", StringComparison.CurrentCultureIgnoreCase))
            {
                //不继续
                return false;
            }
            return true;
        }
    }
}

谢谢您的浏览!