网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区



标题: [c] 到底怎么才可以熟练的掌握合运用递归呢?
然然
TW中级会员
Rank: 3Rank: 3



UID 117185
精华 10
积分 415
帖子 221
阅读权限 30
注册 2007-3-8
状态 离线
发表于 2008-6-30 13:44 资料 短消息 加为好友
到底怎么才可以熟练的掌握合运用递归呢?

我自学数据结构在,每个算法都要实现的,看到了树,
*Y0I3P1m)E#`-s(x我以前的知识,只有一本谭浩强的C, tech.techweb.com.cn$c)c,y6u!x"N)~%Z2T5t
从树这里都开始我就开始深入些的接触递归了。
$x$t-e*s-u$S8g程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛
:A#I3N!i!Mtech.techweb.com.cn但是我发现,关于设计递归算法的时候一个很奇怪的问题,递归的程序结构一般非常的简单,但是程序运行的步骤却相对复杂很多,用递归思路设计算法更加难上加难对我来说,
+a6D,]5o%~(]8}程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛我这2个多星期,一直在学习递归,相对一些复杂点的递归程序,要我硬推的话,打开个记事本 8f%Q%w;n+^"`5[8K;Q
一边记录一边推,都推的出来了,递归程序的运行步骤,我比较清楚,但是每个递归算法设计出来,都有他的思路把,我网上也找了些,递归程序,都是这样,推的出程序运行步骤,却还是不清楚递归程序为何这样设计,这个程序的思路是什么? TechWeb-技术社区2Y:[7F6I0M5M;Y

"w&`.t.x.\%v(d$C+ATechWeb-技术社区这个我都搞不清楚,常常,碰到什么问题的话,要自己设计递归算法解决问题那更加不可能了,根本无从下手。
'V+V%_#r C Q5X4U.U请问大侠我该怎么样才能学好递归呢?学好递归算法的设计思路呢?
+c*Y4`:e"^9A程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛如果大侠有些深入讲解递归的资料发上来谢谢了啊。 tech.techweb.com.cn"X,x Y3s:F
+y3g7e5g x-b
最后发一个我还在思考的课后习题,也希望大侠你也可以写出个好的算法发上来,最好用递归,注释一定要详细点哦,算法思路也讲详细的哦。。谢谢。

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:27 资料 短消息 加为好友
C/C++ code


#include<stdio.h>
#include<string.h>
typedef int type;
typedef struct node
{
    type date;
    struct node *lchild,*rchild;
    type hd,hx;

}frame;
frame *greattree()
{
   type x;
   frame *bt;
   scanf("%d",&x);
   if(x==-1)
       bt=NULL;
   else
   {
       bt=(frame *)malloc(sizeof(frame));
       bt->date=x;
       bt->lchild=greattree();
      
       bt->rchild=greattree();


     

   }

  
   return bt;
}




树的创建已近写好,
算法要求
每个节点
lchild为他的第一个孩子节点,rchild为兄弟节点,
每个节点的hd 存储,他所有的孩子节点,每个节点的hx存贮他的孩子节点和他兄弟节点的总和。


换句话说,每个结点的hd存贮,它的左子树的所有节点数,每个节点的hx存储,它的左子树的节点合加上他右子树的节点合

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:27 资料 短消息 加为好友
我有速成办法...可以比较难,你去看一下lambda演算,或者去学一下纯函数式编程.
如果是其它的办法,关键是递归地定义问题,定义解决方法,然后使用递归的方法求解.

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:27 资料 短消息 加为好友
这个看书效果不大,多写才是硬道理

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:27 资料 短消息 加为好友
不要急,现在理解不了,先不看,过些日子再看

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:27 资料 短消息 加为好友
递归这东西,关键你要首先理解算法,(通过看书) 然后自己实践

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:27 资料 短消息 加为好友
换句话说,每个结点的hd存贮,它的左子树的所有节点数,每个节点的hx存储,它的左子树的节点合加上他右子树的节点合

....这里我写错了纠正下每个节点hx存储的是,左子树的节点合,加上这个节点的右节点的右节点。。。。。。每次都是p=p->lright,直到P为零所经过的节点合
还有2楼的大侠,上次你发我个程序,程序我自己推了一遍得到了正确结果,但是不知道你这个程序的设计思路是啥
BiTree pre,Thrt;  

C/C++ codevoid InOrderThreading(BiTree T)  
{  
    if(!(Thrt=(BiTree)malloc(sizeof(BiNode))))  
    {  
        printf("AOverFlow");  
        exit(1);  
    }  
    Thrt->LTag=Link;  
    Thrt->RTag=Thread;  
    Thrt->Rchild=Thrt;  
    if(!T)  
    {
        Thrt->Lchild=Thrt;  
        Thrt->LTag=Thread;
    }
    else  
    {  
        Thrt->Lchild=T;  
        InThreading(T, Thrt, Thrt);   
    }  
}  

void InThreading(BiTree curr, BiTree p, BiTree l)  
{  
    if (curr->Lchild)
    {
        InThreading(curr->Lchild, p, curr);
    }
    else
    {
        curr->Lchild = p;
        curr->LTag = Thread;
    }
    if (curr->Rchild)
    {
        InThreading(curr->Rchild, curr, l);
    }
    else
    {
        curr->Rchild = l;
        curr->RTag = Thread;
    }
}  




就是这个2叉树中序线索化的函数

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:28 资料 短消息 加为好友
大侠。。。你等俺天荒地老,日月无光,海枯石烂啊。。。。

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:28 资料 短消息 加为好友
现在是教育网,很慢...很多消息回复不了的.

引用 回复 顶部
游客
未注册









发表于 2008-7-4 13:28 资料 短消息 加为好友
我觉得写程序来提高比较好 给你个步骤
1. 写一个递归实现 !n 这个比较简单
2. 写递归实现二叉树遍历
3. 递归实现汉诺塔
4. 递归实现八皇后问题

如果你能按步骤自己把这些程序写出来 你用递归应该没任何问题了

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-9-6 02:08
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.021275 second(s), 7 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP