免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3739 | 回复: 11
打印 上一主题 下一主题

[算法] 问下递规和迭代 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-02 15:20 |只看该作者 |倒序浏览
俺数学不太好,搞不明白,看了半天汉诺塔看不明白
先问迭代,迭代的意思就是循环么?
假设数列1,3,5,7,9...规律为S(n)=S(n-1)+2
然后算数列和,X(n),X(n)=S(1)+S(2)+....(n)
假设算X(10)
我首先想到的办法就是
C写还不大会,我用汇编写个大概(汇编我也不大会)

assume cs:codename1
codename1 segment
mov ax,1                   ;S(1)=1
mov dx,0
mov bx,10
dec  bx
mov cx,bx                  ;设置循环次数
s:add dx,ax
add ax,2                    ;S(n)=S(n-1)+2
loop s
mov ax,4c00h
int 21h
codename1 ends
end

这个算法就叫循环吧.
如果按照递规算法就是,X(n)=X(n-1)+2 这方法最后也是循环吧...理解不了..
递规难道就是可以不手动设置循环次数么?
在汇编中存在递规算法么?

论坛徽章:
0
2 [报告]
发表于 2008-05-02 15:28 |只看该作者
汉诺塔那个公式 2^n-1
这个公式是数学过程推导出来的
那网上的那段递规程序是在做啥
直接把这个公式放进程序里面不是很简单吗?
难道程序能把 2^n-1 这个公式推导出来,程序最后不是得出的直接结果么

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2008-05-02 15:42 |只看该作者
递归:过程自身调用自身。
迭代:循环
本质无区别,但就计算机来说,递归是对于函数。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2008-05-02 15:56 |只看该作者
另外,递归、迭代和使用什么样的过程化的语言无关,注意,一定要是过程化的语言。

论坛徽章:
0
5 [报告]
发表于 2008-05-02 16:02 |只看该作者
原帖由 cjaizss 于 2008-5-2 15:42 发表
递归:过程自身调用自身。
迭代:循环
本质无区别,但就计算机来说,递归是对于函数。

再问下
网上那段解决汉诺塔问题的递规算法的代码
到底起了什么作用?
2^n-1 这个公式应该是人才能想出来的结果.
那段递规算法代码是不是就是让计算机一个一个的去试啊,穷举的方式来算的啊?(感觉计算机就适合做那种工作)


另外我再询问下这个问题
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

如果计算机解决这种问题,
是不是把初始条件输入,比如大小是8*8,皇后8个,然后输入限制条件,3个条件
然后计算机开始穷举,凡是下一步属于限制条件,则放弃,然后试下一个路线.
"解决这个问题,人不需要得出一个简化的公式,只需要把这个实际问题抽象成一个能够输入计算机的模型."这个说法对么?

又是 cjaizss 偶像

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2008-05-02 16:10 |只看该作者
。。。。。。。
“网上那段解决汉诺塔问题的递规算法的代码”,哪段啊?
"解决这个问题,人不需要得出一个简化的公式,只需要把这个实际问题抽象成一个能够输入计算机的模型."不需要得到简化的公式的想法是不对的(我理解是优化或者更快的算法的意思),可是如果连数学的模型都搭不出来,就不用谈优化了。

论坛徽章:
0
7 [报告]
发表于 2008-05-02 16:31 |只看该作者
原帖由 cjaizss 于 2008-5-2 16:10 发表
。。。。。。。
“网上那段解决汉诺塔问题的递规算法的代码”,哪段啊?
"解决这个问题,人不需要得出一个简化的公式,只需要把这个实际问题抽象成一个能够输入计算机的模型."不需要得到简化的公式的想法是不对 ...

网上一搜一大堆,网上讲递规的经典例子
#include <stdio.h>
void hano(int n,char a,char b,char c)
{
if(n==1)
printf("\t将%d个盘片从%c移动到%c\n",n,a,c);
else {
hano(n-1,a,c,b);
printf("\t将第%d个盘片从%c移动到%c\n",n,a,c);
hano(n-1,b,a,c);
}
}
main()
{
int n;
printf("输入将要移动多少个盘子n:";
scanf("%d",&n);
printf("递归结果:\n";
hano(n,'x','y','z');
}

------------------------------------------------------------------------------
比如对于汉诺塔问题,如果我们已经得出移动次数为2^n-1了,那计算机都没啥用了撒,基本上就是叫计算机计算2^n等于多少了.
递规的例子却这么复杂

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2008-05-02 16:38 |只看该作者
.......没看懂你想说什么

论坛徽章:
0
9 [报告]
发表于 2008-05-02 16:51 |只看该作者
原帖由 cjaizss 于 2008-5-2 16:38 发表
.......没看懂你想说什么


汉诺塔这个题目不是要算N个盘子的时候移动次数么
可以通过数学步骤推导出公式为2^n-1
这问题交给计算机做,不是直接叫计算机做2^n-1等于多少吗?
为啥还要用啥递规,还这么复杂一段代码来计算..?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2008-05-02 18:15 |只看该作者
原帖由 dgfsdgs 于 2008-5-2 16:51 发表


汉诺塔这个题目不是要算N个盘子的时候移动次数么
可以通过数学步骤推导出公式为2^n-1
这问题交给计算机做,不是直接叫计算机做2^n-1等于多少吗?
为啥还要用啥递规,还这么复杂一段代码来计算..?

汉诺塔只算个次数有个啥用?当然要给出具体步骤啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP