| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3258 人关注过本帖, 3 人收藏
标题:今天无意中发现的一个很优美的递归
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,小黑的分析很透彻,那即是我的想法。

在递归结构上,我的算法与小曹所看到的算法没什么区别,寻找一个区间内的满足条件的分数,然后以此分数将原区间划分成两个区间继续这一步骤。这个过程和二叉树的中序遍历是完全一样的。

所以其实问题的关键在于如何找到这个满足条件的分数。具体又可细化为两个问题。

1.如何判断区间内是否存在满足条件的分数?

2.如果确定区间内存在满足条件的分数(可能有多个),如何找到其中一个(具体是哪个无所谓)?

由于小曹的原题在0到1的区间内有一个很漂亮的数学结构,所以那个算法构造的确实简洁漂亮,称得上优美。

而我的算法是按小曹扩展后的要求做的,其定义域是正有理数,在这个范围内上面的数学结构失效,我也没有找到一个类似的简单的数学结构,只能穷举,这也是我的算法不能称为完美的主要原因。

42楼的困惑在于对我的式子推导错误造成的。其中e的计算过程存在一个取整运算。正是这个运算的存在超出了我目前的分析能力,而我目前也无法消除这个运算,所以只能穷举。

小曹的困惑可能是我将这个关于n的穷举过程也融入了递归当中。

即使这样,目前来看这个算法的效率还是明显优于现在已有的非递归遍历的算法。


有谁能解决上面我提出的两个问题,才能获得一个真正优美的算法。

重剑无锋,大巧不工
2012-12-21 11:24
xtjopt
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:168
注 册:2012-9-12
收藏
得分:0 
回复 21楼 beyondyf
看了好久,才懂点递归到底是怎么用了


void print(int a, int b, int c, int d, int n)
{
     if (b + d > n) return;
     print(a, b, a+c, b+d, n);
     printf("%d/%d\n", a+c, b+d);
     print(a+c, b+d, c, d, n);
}
不过楼主发的这段代码确实看不太懂


[ 本帖最后由 xtjopt 于 2013-1-13 00:31 编辑 ]
2013-01-12 22:57
cz1995
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2013-1-11
收藏
得分:0 
   








 其实我看不懂
2013-01-13 00:04
快速回复:今天无意中发现的一个很优美的递归
数据加载中...
 
   



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

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