中国自动化学会专家咨询工作委员会指定宣传媒体
免费注册 登录 广告服务 | 客服中心
您现在所在的是:

PLC论坛

抖音 德嘉 泓格论坛 FLIR红外热像论坛
工控论坛首页 PLC论坛 → 浏览主题: [讨论]高手进, 请教PLC程序写法
发表新帖 回复该主题
回帖:53个,阅读:20240 [上一页] [1] [2] [3] [4] [5] [6] [下一页]
* 帖子主题:

[讨论]高手进, 请教PLC程序写法

分享到
6285
karl 版主
文章数:1705
年度积分:48
历史总积分:6285
注册时间:2003/12/26
发站内信
发表于:2004/1/28 16:22:00
#0楼
请教各位图虾, 图图图能写递归程序图图

图
6285
karl 版主
文章数:1705
年度积分:48
历史总积分:6285
注册时间:2003/12/26
发站内信
发表于:2004/1/29 1:34:00
#1楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>
1391
starty.z6
文章数:194
年度积分:50
历史总积分:1391
注册时间:2003/12/6
发站内信
发表于:2004/1/29 15:00:00
#2楼
......



[此贴子已经被作者于2004-1-29 18:54:02编辑过]
我所能奉献的--全心奉献!
说了就一定要做到,做不到的还不如不说;
说了而拖延着做的,还不如先做好后再说!
1391
starty.z6
文章数:194
年度积分:50
历史总积分:1391
注册时间:2003/12/6
发站内信
发表于:2004/1/29 15:04:00
#3楼
......


[此贴子已经被作者于2004-1-29 18:36:25编辑过]
我所能奉献的--全心奉献!
说了就一定要做到,做不到的还不如不说;
说了而拖延着做的,还不如先做好后再说!
6285
karl 版主
文章数:1705
年度积分:48
历史总积分:6285
注册时间:2003/12/26
发站内信
发表于:2004/1/30 17:14:00
#4楼
TO: starty.z6
递归
递归算法

程序调用自身的编程技巧称为递归(recursion)。

一个比较经典的描述是老和尚讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,……。这样没完没了地反复讲故事,直到最后老和尚烦了停下来为止。

反复讲故事可以看成是反复调用自身,但如果不能停下来那就没有意义了,所以最终还要能停下来。递归的关键在于找出递归方程式和递归终止条件。即老和尚反复讲故事这样的递归方程式要有,最后老和尚烦了停下来这样的递归的终止条件也要有。

阶乘的算法可以定义成函数

        n*f(n-1)  (n>0)

f(n)=

        f(n)=1   (n=0)

当n>0时,用f(n-1)来定义f(n),用f(n-1-1)来定义f(n-1)……,这是对递归形式的描述。

当n=0时,f(n)=1,这是递归结束的条件。

递归算法一般用于解决三类问题:

⑴. 数据的定义形式是按递归定义的。

比如阶乘的定义。      

例1 又如裴波那契数列的定义:f(n)=f(n-1)+f(n-2); f(0)=1; f(1)=2

对应的递归程序为:

var n:integer;

function f(n:integer):longint;

begin

    case n of

       0:f:=1;  {递归结束条件}

       1:f:=2;

     else

       f:=f(n-1)+f(n-2)  {递归调用}

    end

end;

begin

    readln(n);

    writeln(f(n))

end.

这类递归问题往往又可转化成递推算法,递归边界作为递推的边界条件。

⑵. 问题解法按递归算法实现。例如回溯等。

⑶. 数据的结构形式是按递归定义的。如树的遍历, 图的搜索等。

递归解决实际问题的例子很多,如经典的梵塔问题。

例2 梵塔问题:有n个半径各不相同的圆盘,按半径从大到小,自下而上依次套在A柱上,另外还有B、C两根空柱。要求将A柱上的n个圆盘全部搬到C柱上去,每次只能搬动一个盘子,且必须始终保持每根柱子上是小盘在上,大盘在下。

在移动盘子的过程当中发现要搬动n个盘子,必须先将n-1个盘子从A柱搬到B柱去,再将A柱上的最后一个盘子搬到C柱,最后从B柱上将n-1个盘子搬到C柱去。搬动n个盘子和搬动n-1个盘子时的方法是一样的,当盘子搬到只剩一个时,递归结束。

程序如下:

var a,b,c,number:integer;

procedure move(n,a,b,c:integer);

begin

    if n=1 then writeln(a,'->',c)

    else

        begin

             move(n-1,a,c,b);

             writeln(a,'->',c);

             move(n-1,b,a,c)

        end;

end;

begin

    write('the number of dish:');

    readln(number);

    move(number,1,2,3);

    readln

end.

自然数的拆分,数字的拆分等都可以用到递归算法。

例3 要求找出具有下列性质的数的个数(包含输入的自然数n):

先输入一个自然数n(n<=500),然后对此自然数按照如下方法进行处理:

①. 不作任何处理;

②. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;

③. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.

样例:  输入:  6

满足条件的数为   6

               16

               26

              126

               36

              136

输出:  6

这道题只需求出满足条件的数的个数,在n值不大的情况下用递归求解比较方便,因为它本身题目的条件就是递归定义的。

递归的样例程序如下:

var n,i:integer;

   s:real;

procedure qiu(x:integer);

var k:integer;

begin

    if x<>0 then

    begin

         s:=s+1;

         for k:=1 to x div 2 do qiu(k)

    end

end;

begin

    readln(n);

    s:=0;

    qiu(n);

    writeln(s:2:0)

end.

递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

图
5386
dzfa 版主
文章数:2050
年度积分:53
历史总积分:5386
注册时间:2003/1/7
发站内信
发表于:2004/1/30 18:45:00
#5楼
楼主是什么意思呀?
要是讲课来了,那可真是欢迎之置了.以楼主的水平,解决这么个递归的问题肯定是小菜一碟了.
要是考教来了,我看还是换个时间吧,大过年的,都忙着呢.谁有时间来作这些无趣的工作呀.
人家高手不一定对你的问题感兴趣,人家也没有义务必须回答什么问题.别人家不答就说人家不敢什么的.

如有得罪,请多原谅!!!
烟台东泽----西门子山东地区之代理商,系统集成商
里的打杂的
6285
karl 版主
文章数:1705
年度积分:48
历史总积分:6285
注册时间:2003/12/26
发站内信
发表于:2004/1/30 19:09:00
#6楼
技术贴,辩论而已.还请dzfa原谅!
图
1391
starty.z6
文章数:194
年度积分:50
历史总积分:1391
注册时间:2003/12/6
发站内信
发表于:2004/1/30 19:17:00
#7楼
好,多谢楼主,这样,我现在有个程序需要进行密码控制,
大致意思是:我的设备运行到30天的时候会自动停下来,客户交设备租金后我们电话给他密码,要长年累月如此,肯定不能用几个密码就行的,但如果我们用公式进行密码设置,长年的他们也有可能捕捉得出规律,而赖去租金。
请教楼主,这密码设置是不是类似递归程序呢,按楼主的方法可以这样设置这类密码吗?
谢!
我所能奉献的--全心奉献!
说了就一定要做到,做不到的还不如不说;
说了而拖延着做的,还不如先做好后再说!
1391
starty.z6
文章数:194
年度积分:50
历史总积分:1391
注册时间:2003/12/6
发站内信
发表于:2004/1/30 19:22:00
#8楼
dzfa兄去哪找星星去了。那么久不见来了。
我所能奉献的--全心奉献!
说了就一定要做到,做不到的还不如不说;
说了而拖延着做的,还不如先做好后再说!
5386
dzfa 版主
文章数:2050
年度积分:53
历史总积分:5386
注册时间:2003/1/7
发站内信
发表于:2004/1/30 19:28:00
#9楼
好象一般的PLC都不支持程序或子程序调用自身,但似乎可以自己通过堆栈处理来实现.
以"f(n)=f(n-1)+f(n-2); f(0)=1; f(1)=2"为例,就是在一个扫描周期中,将F(N)分解成F(N-1)和F(N-2)并以一定的方式存入堆栈,下一扫描周期则从栈顶取一数据,如N=0,1则进行加运算,如N>1则继续分解入栈, 应该可以实现,不知楼主怎么看.
烟台东泽----西门子山东地区之代理商,系统集成商
里的打杂的
工控学堂推荐视频:

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004