A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵刘滨 中级黑马   /  2012-8-10 15:32  /  1390 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是递归算法?(麻烦用代码说明下)

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

3 个回复

倒序浏览
c#题目如下:
要求输出:1,2,3,5,8,13,21,34,55,89
写法一:
public class MyClass
{
        public static void Main()
        {
                int[] cSum = new int[10];
        string sSum="";
        for (int i = 0; i < cSum.Length; i++)
        {
                        if(i==0)
                        {
                                cSum[i]=1;
                                sSum=""+cSum[i];
                        }
                        else if(i==1)
                        {
                                cSum[i]=cSum[i-1]+cSum[i-1];
                                sSum=sSum+','+cSum[i];
                        }
                        else
                        {
                                cSum[i]=cSum[i-1]+cSum[i-2];
                                sSum=sSum+','+cSum[i];
                        }
                }
                //输出结果1,2,3,5,8,13,21,34,55,89,普通写法
                Console.WriteLine(sSum);
                Console.ReadKey();
        }
}
Snippet Compliler调试通过
这样写虽然能实现,但是感觉不大好,重构,用递归写法
写法二:
public class MyClass
{
        public static void Main()
        {
                int[] cSum= new int[10];
                string sSum="";
                for(int j=0;j<cSum.Length;j++)
                {
                        cSum[j]= process(j);
                        if(sSum!="")
                        {
                                sSum=sSum+',';
                        }
                        sSum+=cSum[j];
                }
                //输出结果1,2,3,5,8,13,21,34,55,89,递归写法
                Console.WriteLine(sSum);
                  Console.ReadKey();   
        }
       
        public static int process(int i)
        {
                int s;
                if(i==0||i==1)
                {
                        s=i+1;
                }
                else
                {
                        s=process(i-1)+process(i-2);
                }
                return s;
        }
}
通过递归算法重构了写法一
下面留个题目,要求输出:1,1,2,3,5,8,13,21,34,55
写法三:
public class MyClass
{
        public static void Main()
        {
                         int[] cSum = new int[10];
            string sSum="";
            for (int i = 0; i < cSum.Length; i++)
            {
                                if(i==0||i==1)
                                {
                                        cSum[i]=1+cSum[i];
                                        if(sSum!="")
                                        {
                                                sSum+=",";
                                        }
                                        sSum+=cSum[i];
                                }
                                else
                                {
                                        cSum[i]=cSum[i-1]+cSum[i-2];
                                        sSum=sSum+','+cSum[i];
                                }
                        }
                        //输出结果1,1,2,3,5,8,13,21,34,55
                        Console.WriteLine(sSum);
                        Console.ReadKey();
        }
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
递归是一种编程手法,简单的说就是函数自身调用自身,下边给你来一个求1+2+3+.....和的代码,很容易理解的
  1. public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.         int sum = getSum(100);
  4.         System.out.println("sum="+sum);
  5.         }
  6.        
  7.         public static int getSum(int n)
  8.         {
  9.                 if(n==1)
  10.                         return 1;
  11.                 return n+getSum(n-1);
  12.         }
  13. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
我感觉递归较接近思维的方式,用于解一些光用循环解起来较复杂的问题
例1.阶乘(算比较有特点的了)
计算x!
一般循环就是
int multi = 1;
if (x <=1) return (1);
for(int i=1;i<=x;i++)
  multi = multi*i;
return(multi);

递归把x!看作x*(x-1)!
int multi(int x)
{
if(x==0||x==1) return 1;
else return x*multi(x-1);
}
这样就能把x!算出来

例2 最著名的就是汉诺塔了
你可以网上找点资料看看

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马