递归就是把大问题转化为小问题,然后解决小问题。
你在考虑一个问题的时候要这么想:
这个问题是什么?能够分解为更简单的 有规律的小问题吗?
如果能
那么好,现在编写一个方法解决小问题,
解决完小问题你要考虑,让方法跳出。
以下是我练习递归时 自己做得题 在这里我要感谢一下袁晓俊同学,是他出的一道题让我更加深刻的理解了递归。
袁晓俊同学出的题:
写一个程序,要求用户任意输入N个字符,然后输出这些字符组合出现的可能
如:输入ab1
可能出现的字符串:ab1 a1b ba1 b1a 1ab 1ba
我的做法:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("请输入任意字符!");
- string str;
- LuRuZiFu:
- str = Console.ReadLine();
- if (str == string.Empty)
- {
- Console.WriteLine("不能输入空字符串,请重新输入!");
- goto LuRuZiFu;
- }
- for (int i = 0; i < str.Length; i++)
- {
- char temp = str[i];
- int suoyin = str.IndexOf(temp);
- if (suoyin != i && suoyin != -1)
- {
- Console.WriteLine("字符串有重复的字符,请重新输入!");
- goto LuRuZiFu;
- }
- }
- Console.Write("可能出现的字符!");
- PaiLieZuHe(str.ToCharArray(), 0, str.Length);
- Console.ReadKey();
- }
- static void JiaoHuan(ref char a, ref char b)
- {
- char temp = a;
- a = b;
- b = temp;
- }
- static void PaiLieZuHe(char[] jiaohuanwenben, int kaishi, int jieshu)
- {
- //交换到最后一位
- if (kaishi == jieshu - 1)
- {
- Console.Write(new string(jiaohuanwenben) + " ");
- }
- else
- {
- for (int i = kaishi; i < jieshu; i++)
- {
- JiaoHuan(ref jiaohuanwenben[i], ref jiaohuanwenben[kaishi]);
- PaiLieZuHe(jiaohuanwenben, kaishi + 1, jieshu);
- JiaoHuan(ref jiaohuanwenben[i], ref jiaohuanwenben[kaishi]);
- }
- }
- }
- }
- }
复制代码 网上找的题
1.把一个整数按n(2<=n<=16)进制表示出来,并保存在给定字符串中。比如121用二进制表示得到结果为:“1111001”。
我的做法
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace 一个数字的所有进制显示用递归表示出来
- {
- class Program
- {
- static void Main(string[] args)
- {
- List<List<char>> suoyoujinzhi = new List<List<char>>();
- Console.WriteLine("请输入数字");
- int tempint = Convert.ToInt32(Console.ReadLine());
- SuoYouJinZhi(tempint, 2, 16, suoyoujinzhi);
- foreach (var item in suoyoujinzhi)
- {
- string str = new string(item.ToArray());
- Console.WriteLine(str);
- }
- Console.ReadKey();
- }
- static char PiPeiZiFu(int i)
- {
- switch (i)
- {
- case 10:
- return 'A';
- case 11:
- return 'B';
- case 12:
- return 'C';
- case 13:
- return 'D';
- case 14:
- return 'E';
- case 15:
- return 'F';
- default:
- return Convert.ToChar(i.ToString());
- }
- }
- static void SuoYouJinZhi(int shuzi, int kaishi, int jieshu, List<List<char>> suoyoujinzhi)
- {
- if (kaishi == jieshu + 1)
- {
- return;
- }
- else
- {
- //保存输入数字的值
- int tempint = shuzi;
- //创建一个字符串用来保存所得到的N进制结果
- List<char> temp = new List<char>();
- while (shuzi >= kaishi)
- {
- //把余数加入到字符串开头
- temp.Insert(0, PiPeiZiFu(shuzi % kaishi));
- //更新原数字。
- shuzi /= kaishi;
- }
- //如果剩余的数字不是0那就把它加到开头
- if (shuzi != 0)
- {
- temp.Insert(0, PiPeiZiFu(shuzi));
- }
- //在开头加上是多少进制。
- temp.InsertRange(0, string.Format("{0}进制结果:", kaishi).ToCharArray());
- //把第N进制的结果保存到所有进制里
- suoyoujinzhi.Add(temp);
- // 进行下一个进制的计算
- SuoYouJinZhi(tempint, ++kaishi, jieshu, suoyoujinzhi);
- }
- }
- }
- }
复制代码
|