免费注册 查看新帖 |

Chinaunix

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

[文本处理] 新人学习递归函数求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-30 17:53 |只看该作者 |倒序浏览
小弟在一本书上看到一个数学阶乘的范例,一直不解。我先把脚本贴上来。

function factor_in()  {
local tmp
local tmp1

tmp="$1"

if [ $tmp -eq 1 ] ;then
echo -n " 1 "
r=1

else

echo -n " $tmp * "
tmp1=$tmp
tmp=$(($tmp-1))
factor_in $tmp
#计算总乘积
r=$(($tmp1 * $r))

fi
}

echo
echo -n $1 " ! = "
factor_in $1
echo -n "= $r"
echo

这段脚本还有个判断提供的参数是否正确,我就不敲了。

小弟我不太理解标红的那段代码。先从if 那里开始:(假设$1 是 5)

1. r 开始是没有值的,除非$tmp 等于 1,才会赋予 r 的值为1 ,这么理解对吗?

2. 否则,开始执行else后面的命令 , r=$(($tmp1 * $r)) 也是属于 else 后面的命令,对吗?

3. 既然执行else后面的命令,这个时候 r 是没有 值的 ,但小弟把 r=$(($tmp1 * $r))  改为   echo "$tmp1 * $r" ,发现显示的是
    2 * 1
    3 * 1
    4 * 1
    5 * 1

问题1:r是没有值的,为什么会显示 后面的 1,而且把r 改为 2 ,显示的结果也都是 * 2。

问题2:r=$(($tmp1 * $r))  是怎么在循环中计算总乘积的。

还请路过的各位大哥帮忙解答下,谢谢。




论坛徽章:
0
2 [报告]
发表于 2013-07-30 18:09 |只看该作者
在运行r=$(($tmp1 * $r))之前,他必须先运行factor_in $tmp
这边就是运用递归
假如$1是5,他先运行factor_in $tmp,此时$tmp是4,进行递归,
此时$1变成4,再运行factor_in $tmp,此时$tmp是3,
以此类推,当$tmp为1时,if [ $tmp -eq 1 ] 判断成立,给r赋值为1。此时最里层的factor_in 方法运行结束,
跳到外面一层,继续运行r=$(($tmp1 * $r)),即 r=2*1,此时factor_in 方法又结束,
跳到再外面一层,继续运行r=$(($tmp1 * $r)),
直到最后方法运行结束。

不知道这么说清楚么

论坛徽章:
0
3 [报告]
发表于 2013-07-31 11:07 |只看该作者
回复 2# spiraspera
谢谢,差不多理解了,问了些其他人,貌似是 else 后面的递归完后,再回到 else之前,赋值r=1 。然后  if 语句结束。

  

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
4 [报告]
发表于 2013-07-31 13:03 |只看该作者
@yzxarlen程序书写出来,那些语句前后左右永远是平面关系,但要理解的要有纵向思维,特别是递归。

多多练习,想想下面一个问题的求解过程:

一个盒子,体积不知道,只知道里面嵌套多层盒子,且最里面的盒子(该盒子里不再有盒子)的体积是a
其他每层的盒子都是其里面的那个盒子的体积加一个固定常数n。


现在求最外层的盒子的体积。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2013-07-31 13:48 |只看该作者
回复 3# yzxarlen

you have to know the recursion

f(n) = f(n-1) * n
f(1) = 1

1. f(5)
you can't get the result for f(5)
call f(4) * 5
2. f(4)
you can't get the result for f(4)
call f(3) * 4
...
3. f(3)
you can't get the result for f(3)
call f(2) * 3
...
4. f(2)
you can't get the result for f(2)
call f(1) * 2

5. f(1)
Now, you can get the result 1 for f(1)
use global r variable return the value 1

6. f(2) get result 2 by f(1) * 2  

7. f(3) get result 6 by f(2) * 3  

8. f(4) get result 24 by f(3) * 4  

8. f(5) get result 120 by f(4) * 5  
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP