| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 260 人关注过本帖
标题:关于递归的问题
只看楼主 加入收藏
zcl33442
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-4-4
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
关于递归的问题
求大神帮我解释下递归的问题 , 对于递归这个概念我一直很模糊,感觉很绕,谁能解释下递归到底是什么?有什么作用?主要用在什么地方?
2014-04-04 21:46
zcl33442
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-4-4
收藏
得分:0 
回复 楼主 zcl33442
我的QQ 1075025015
2014-04-04 21:52
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:7 
递归就是一种算法,详情去百度。那里讲的更清楚

想抽苏烟了。
2014-04-04 22:04
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:7 
递归是函数自身调用自身的一种算法。
如:
#include <stdio.h>
// 函数功能:求n的阶乘
double  fac(int n)
{  double  y;
   if(n<0) printf("data error!\n");
   else if(n==0||n==1)y=1;
   else y=n*fac(n-1);      //自身调用自身
   return y ;
}
//主函数
int  main()
{  int n;
   double  y;
   scanf("%d",&n);
   y=fac(n);
   printf("%d! =%.0lf",n,y);
   return 0;
}
2014-04-05 10:28
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:7 
简单来说,一个函数直接或者间接调用自身,就是递归调用了~~
递归调用,能用很简单的编码来处理比较繁琐的步骤。
间接调用先不说了,就说直接调用吧,我知道的也就是入门的知识。。。
间接调用的思想类似直接调用就是被调用的函数种类多了。

例如求一个正整数n的阶乘,咱们知道5以内的很好算,如果再大点就麻烦了,如果好几十甚至上百就更繁琐了,用程序语言的循环语句神马的直接来实现也不太现实。
n的阶乘,就是 n!= n * (n-1) *(n-2) * ... * 2 * 1 = n * (n-1)!。
我们知道当n=1时候,n! = 1; 然后我们还规定(这个不太符合我们的思想) 0! = 1;这个规定有助于数学计算。
然后给我们一个数,n 让我们求它的阶乘,我们就像了~~阶乘嘛,就是从n连乘到1,当然了n = n * (n-1)!
而且还有,当n是1或者0的时候,阶乘是1.于是我们有个简单的结成函数:
int fun(int n)
{
    if (n > 1)
    {
         return (n * fun(n-1));
     }
     else
     {
         return (1);
      }
}   // 说一下,这里没考虑输入n是负数啊,字符型啊,甚至是char型号的情况,这个例子只是简单介绍下递归调用,函数就看功能实现吧。。。

这个函数是说,给你一个n,你就返回n的阶乘。那么捋顺一下流程吧~~ f
假如当n=5时候,调用 fun(5),此时就要开辟一个新空间来运行fun(5)这个函数了:

fun(5)                                                   fun(5)
------等于                                               ------等于
5*fun(4)                                                  120
   
    ↓调用fun(4)开辟fun(4)空间                            ↑返回fun(4)的结果,回收,fun(4)空间

  fun(4)                                                 fun(4)
  ------等于                                             ------等于
  4*fun(3)                                                24

     ↓调用fun(3)开辟fun(3)空间                           ↑返回fun(3)的结果,回收fun(3)空间

   fun(3)                                                fun(3)
   ------等于                                            ------等于
   3*fun(2)                                                6

      ↓调用fun(2)开辟fun(2)空间                          ↑返回fun(2)的结果,回收fun(2)空间

     fun(2)                                             fun(2)
     ------等于                                         ------等于
     2*fun(1)                                             2

         ↘调用fun(2)开辟fun(1)空间              ↗返回fun(1)的结果,回收fun(1)空间
                                                   这里是返回到fun(2)按照顺序来
                        此时n=1,直接返回数值:fun(1)=1
                            不再继续调用fun()函数


这就是流程了,看下箭头,不太熟悉给字体变颜色,凑合看吧。。。

一般来说,设计函数的递归,你要找到其中某些数据变化从而引起其他数据(结果)变化的关系,不过处理
什么最终都得落到处理数据这个层面上,因为计算机就是处理的数据。

在阶乘例子里面,关系就是当n是大于1的整数时候等于n*(n-1)!;当n=1或者n=0时候等于1。
这个关系的选择类似数学里面数学归纳法的那么个思想,呃。。

剩下的一个就是处理好递归调用的结尾,以为一直是调用某个函数,那么总得有个头啊,
在这里就是当n=1或者n=0时候等于1,也就是函数返回1,不再继续调用函数了,然后递归调用开始依次序,以后来先至的顺序依次回归。

关于递归,找几个例子,自己拿着纸和笔,一步步画一下流程吧,理解的多了就能熟练了,希望楼主学习编程能取得好的进展

未知令人期待!
2014-04-05 23:10
快速回复:关于递归的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016392 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved