黑马程序员技术交流社区
标题:
为什么在用到递归的时候总是没有头绪
[打印本页]
作者:
lpz869
时间:
2014-5-28 23:02
标题:
为什么在用到递归的时候总是没有头绪
本帖最后由 lpz869 于 2014-5-29 10:54 编辑
为什么在用到递归的时候总是没有头绪
作者:
continue
时间:
2014-5-29 09:32
你要明白什么情况下用递归,递归执行的条件,好处,特点
作者:
劇情侢媄終究媞
时间:
2014-5-29 11:17
递归.我是这样认为的.只要想清楚第一层的 思路.就可以了
作者:
林枫
时间:
2014-5-29 19:25
递归就是把大问题转化为小问题,然后解决小问题。
你在考虑一个问题的时候要这么想:
这个问题是什么?能够分解为更简单的 有规律的小问题吗?
如果能
那么好,现在编写一个方法解决小问题,
解决完小问题你要考虑,让方法跳出。
以下是我练习递归时 自己做得题 在这里我要感谢一下袁晓俊同学,是他出的一道题让我更加深刻的理解了递归。
袁晓俊同学出的题:
写一个程序,要求用户任意输入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);
}
}
}
}
复制代码
作者:
林枫
时间:
2014-5-29 19:32
还有几道简单的,你也可以看看
求数组中最大数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 求数组中最大数
{
class Program
{
static void Main(string[] args)
{
int[] shuzu = new int[] { 10, 2, 5, 611, 111, 45, 123 };
int weizhi = ZuiDaShuWeiZhi(shuzu, 0, 0);
Console.WriteLine("最大数为{0}", shuzu[weizhi]);
Console.ReadKey();
}
static int ZuiDaShuWeiZhi(int[] a, int weizhi, int i)
{
if (i == a.Length)
{
return weizhi;
}
if (a[i] > a[weizhi])
{
return ZuiDaShuWeiZhi(a, i, ++i);
}
return ZuiDaShuWeiZhi(a, weizhi, ++i);
}
}
}
复制代码
1,2,3....n 求n
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 递归
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("1,2,3....n");
Console.WriteLine("n为?");
string str = Console.ReadLine();
Console.WriteLine(DiGui(Convert.ToInt32(str) - 1));
Console.ReadKey();
}
static int DiGui(int n)
{
if (n == 0)
{
return 1;
}
if (n == 1)
{
return 2;
}
return DiGui(n - 2) + DiGui(n - 1);
}
}
}
复制代码
求n个整数的乘积
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 求n个整数的乘积
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ChengJi(6));
Console.ReadKey();
}
static int ChengJi(int i)
{
if (i == 1)
{
return 1;
}
return i * ChengJi(--i);
}
}
}
复制代码
版主同学,我明天就面试了,技术分还不够,看在我这么辛苦的份上来点分吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2