免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: ITHJF
打印 上一主题 下一主题

[算法] 算法设计中的台阶问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-08-24 11:28 |只看该作者

回复 #7 ypxing 的帖子

其实就是把你程序的尾递归改成循环而已,本质是一样的。

论坛徽章:
0
12 [报告]
发表于 2007-08-24 11:30 |只看该作者
要是这样的话,就这个题目本身来说,
dp就没有什么优势了

原帖由 daly88 于 2007-8-24 11:28 发表
其实就是把你程序的尾递归改成循环而已,本质是一样的。

[ 本帖最后由 ypxing 于 2007-8-24 11:31 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2007-08-24 12:55 |只看该作者
原帖由 daly88 于 2007-8-24 11:28 发表
其实就是把你程序的尾递归改成循环而已,本质是一样的。

这个尾递归改的?怎么个尾法?麻烦你给讲讲。
我知道的是这样
如果一个递归函数,递归的调用自己不止一次,就是个发散的序列。仅仅用一个循环是不可能的。因为你没有办法得到它的路径。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
14 [报告]
发表于 2007-08-24 13:05 |只看该作者
a(1)=1
a(2)=3
a(3)=4
n>3,
a(n)=a(n-1)+a(n-2)+a(n-3)

论坛徽章:
0
15 [报告]
发表于 2007-08-24 23:39 |只看该作者
原帖由 cjaizss 于 2007-8-24 13:05 发表
a(1)=1
a(2)=3
a(3)=4
n>3,
a(n)=a(n-1)+a(n-2)+a(n-3)

a(2)=2

论坛徽章:
0
16 [报告]
发表于 2007-10-27 20:45 |只看该作者

回复 #1 ITHJF 的帖子

整数和数分解变形
#include<stdio.h>
#undef N
#define N 5
void  rd(int i,int *b, int  k){   
        int j = 0;
        int t = 0;
        for(j=i;j>=1;j--)      
                if(j<=3)               /*题目要求*/
                {      
                        b[k]=j;      
                        if(j==i)      
                        {
                                printf("%d=%d",N, b[1]);  
                                for(t=2;t<=k;t++)
                                        printf("+%d", b[t]);
                                printf("\n");
                        }   
                        else      
                                rd(i-j, b, k+1);     //继续分解的数是i-j,分解出第k+1个和数      
                }      
}  
int   main(int   argc,   char*   argv[])   
{   
        int b[N+1];
        b[0]=N;
        rd(N, b, 1);
        return   0;   
}

论坛徽章:
0
17 [报告]
发表于 2007-10-27 21:54 |只看该作者
daly88算法是对的 不过说得不是很清楚
问题的关键在于走上第n(n>=4)个台阶的最后一步.最后一步可能是走1个台阶,2个台阶或者3个台阶
对应停留在第n-1个台阶,第n-2个台阶,第n-3个台阶
三者是互斥的,故f(n)由三者对应的走法相加即可
走上第n-1个台阶有f(n-1)个上法,走上第n-2个台阶有f(n-2)个上法,走上第n-3个台阶有f(n-3)个上法
所以f(n)=f(n-1)+f(n-2)+(fn-3)

论坛徽章:
0
18 [报告]
发表于 2007-10-28 21:27 |只看该作者
让我想想起了这个帖子
http://bbs.chinaunix.net/viewthread.php?tid=779799

[ 本帖最后由 epegasus 于 2007-10-28 21:45 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-10-29 11:07 |只看该作者
原帖由 ivhb 于 2007-8-24 12:55 发表

这个尾递归改的?怎么个尾法?麻烦你给讲讲。
我知道的是这样
如果一个递归函数,递归的调用自己不止一次,就是个发散的序列。仅仅用一个循环是不可能的。因为你没有办法得到它的路径。

这个问题的递归过程并不是无限发散的
假如有4层楼
第1步走(1,1)的效果跟(2) 的效果一样
那么(1,1)跟(2)之后可以分享同一个计算过程,如果利用这点可以避免很多重复的递归运算
这只是个大概,具体的可以去看下算法导论里面的动态规划那章,那个讲得明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP