算法

一、递归

  递归实际上就是分而治之。

举例说明:「实现一个函数翻转给定的字符串」。假设我们要翻转的字符串是「abcdef」,那么翻转之后的结果应该是「fedcba」。毫无疑问这个字符串我们是没办法一下子就翻转过来的,那么「分而治之」吧。我们不能把多个字符一下子就完全翻转过来,但是假如字符串里的字符只有一个呢?我们翻转起来最方便了,因为什么都不用做。好了,我们可以把「abcdef」分解成「a」和「bcdef」两个子字符串。「bcdef」比「abcdef」短一个字符,理论上也稍微容易点。假设我们有这样的函数能接受一个字符串,然后像变戏法一样就能返回一个翻转后的字符串。

如下奉上C#代码,更容易去体会。

 private int intNumber = 1;
        //循环到字符串最短长度
        private int intMinLength = 0;
        private void button1_Click(object sender, EventArgs e)
        {

            //txtStart 文件框 输入初始值如:abcbef。
            //txtCount 文件框 输入循环的次数。
            string strStart = txtStart.Text.Trim();
            string strCount = txtCount.Text.Trim();
            
            if (string.IsNullOrEmpty(strStart))
            {
                MessageBox.Show("初始值不可以为空");
            }
            else if (string.IsNullOrEmpty(strCount))
            {
                MessageBox.Show("循环次数不可以为空");
            }
            else if (strStart.Length <= int.Parse(strCount))
            {
                MessageBox.Show("次数必须小于初始字符串长度");
            }
            else
            {
                //字符串长度 减去 要循环的次数 得到 循环到字符串最短长度(每次少一个)
                intMinLength = strStart.Length - int.Parse(strCount);
                //一个lab,显示结果
                label1.Text = "初始值为:" + strStart + "\r\n\r\n";
                intNumber = 1;
                string strReturnVal = revertString(strStart);
                label1.Text =   label1.Text + "\r\n最终值:" + strReturnVal;
                //MessageBox.Show(strReturnVal);
            }
           

        }

        /// <summary>
        /// 本递归把一个字符串,全翻转过来。 如将abcdef转为fedcba
        /// </summary>
        /// <param name="str">初始值</param>
        /// <returns></returns>
        protected string revertString(string str)
        {
            //循环次数
            int intCount = int.Parse(txtCount.Text.Trim());
            if (str.Length <= intMinLength)
            {
                return str;
            }
            label1.Text = label1.Text + "" + intNumber + "次:" + str.Substring(1) + str.Substring(0, 1) + "\r\n";
            intNumber++;
            return revertString(str.Substring(1)) + str.Substring(0,1);

        }

 

 

 

 

posted @ 2019-12-16 16:31  丁焕轩  阅读(182)  评论(0编辑  收藏  举报