Chinaunix

标题: 函数递归 [打印本页]

作者: guangzongy    时间: 2004-10-11 10:13
标题: 函数递归
shell中函数的递归调用怎么写(哪位大侠给个简单的例子),shell中有没有类似于return的命令??
bjgril走了,这里的人气……  
作者: 寂寞烈火    时间: 2004-10-11 10:45
标题: 函数递归
以前写的一个阶乘的例子,里面就有实现递归的方法
  1. #!/bin/ksh
  2. function factor {
  3. retval=0
  4. factarg=0
  5. if(($1<=1));then
  6.         res=1
  7.         return 0
  8. else
  9.         ((factarg=$1-1))
  10.         factor $factarg #递归调用
  11.         ((retval=$1*$res))
  12.         res=$retval
  13.         return 0
  14. fi
  15. }
  16. factor $1
  17. echo "factor of $1 is $res"
  18. return 0
复制代码

作者: xchen301    时间: 2004-10-11 15:11
标题: 函数递归
啊!不错!!!我想问下,不同的shell递归是不是有不同,
作者: 寂寞烈火    时间: 2004-10-11 15:20
标题: 函数递归
[quote]原帖由 "xchen301"]啊!不错!!!我想问下,不同的shell递归是不是有不同,[/quote 发表:

我用的是pdksh,跟bash是基本兼容的,csh/tcsh的不好说
bsh/bash这样些函数
functionname () {
...
}
作者: guangzongy    时间: 2004-10-11 16:33
标题: 函数递归
在bash shell中递归函数中的变量的问题!
是不是在整个递归调用的过程中,使用同一名称的变量就是同一个变量。换句话说就是在下一层的调用中修改了变量var,当返回上层时,上层的var的值也被修改了。
作者: xchen301    时间: 2004-10-11 16:52
标题: 函数递归
原帖由 "寂寞烈火" 发表:

我用的是pdksh,跟bash是基本兼容的,csh/tcsh的不好说
bsh/bash这样些函数
functionname () {
...
}


哦,THANK U ,你的头像我喜欢~
作者: 寂寞烈火    时间: 2004-10-11 17:00
标题: 函数递归
原帖由 "guangzongy" 发表:
在bash shell中递归函数中的变量的问题!
是不是在整个递归调用的过程中,使用同一名称的变量就是同一个变量。换句话说就是在下一层的调用中修改了变量var,当返回上层时,上层的var的值也被修改了。

试一试,不就知道了?
由于用递归函数,好像对于脚本效能不是很好的,有本书说尽量避免过多的使用递归(忘了哪本书了 )
作者: guangzongy    时间: 2004-10-11 17:21
标题: 函数递归
我试了一下,结果是下层的修改对上层会影响。这个问题的处理比较头痛呀!
作者: 網中人    时间: 2004-10-11 20:41
标题: 函数递归
能否將代碼貼上來, 好讓大家一起琢磨琢磨?

三個臭皮匠勝過一個諸葛亮哦~~~
作者: lightspeed    时间: 2004-10-12 02:43
标题: 函数递归
原帖由 "guangzongy"]我试了一下,结果是下层的修改对上层会影响。这个问题的处理比较头痛呀![/quote 发表:


为防止下层的修改对上层的影响, 对 function 中的 variable 要限制为 local 的。

bash:

fun () {

local abc
..
}

ksh:

fun () {

typeset abc
..

}


[quote]原帖由 "寂寞烈火"]由于用递归函数,好像对于脚本效能不是很好的,有本书说尽量避免过多的使用递归(忘了哪本书了)[/quote 发表:



Page 310 in << Advanced Bash−Scripting Guide >> :

[quote]Local variables permit recursion, but this practice generally involves much computational overhead and
is definitely not recommended in a shell script.

作者: guangzongy    时间: 2004-10-12 09:44
标题: 函数递归
想了解一下shell中的函数递归,所以写了一个试验的代码:

  1.      1  #! /bin/sh

  2.      2  # check parameter's count

  3.      3  if [ ! $# -eq "2" ]
  4.      4  then
  5.      5  echo "usage: ${0} -v modelName"
  6.      6  exit 1
  7.      7  fi
  8.      8  #
  9.      9  IPNETVERSIONDATAPATH="../../lib"
  10.     10  #
  11.     11  # function define --- list directery in target path
  12.     12  #
  13.     13  function listPathContentDirs ()
  14.     14  {
  15.     15  #echo "listPathContentDirs:"$1
  16.       
  17.     16  #
  18.     17  findPath=$1
  19.     18  pathContent=(`ls -l "${findPath}" | awk ' $1 ~ /^d/ {print $9}'`)
  20.     19  echo ${pathContent[@]}
  21.     20  #
  22.     21  }
  23.     22  #
  24.     23  # flag for find target dir
  25.     24  flag1=0
  26.     25  export flag1
  27.     26  # target dir which contain target object
  28.     27  returndir=null
  29.     28  export returndir
  30.     29  #
  31.     30  # function define --- check target path contain target directery
  32.     31  #
  33.     32  function checkPathContainDir ()
  34.     33  {
  35.       
  36.     34  echo "flag1:${flag1}   returndir:${returndir}"
  37.     35  echo "checkPathContainDir:$1   $2"
  38.       
  39.     36  # find target object in this path
  40.     37  local targetPath=$1
  41.     38  # target object
  42.     39  local modelname=$2
  43.     40  #
  44.     41  # call function "listPathContentDirs" to get all dir in this path
  45.     42  local dirLists=`listPathContentDirs ${targetPath}`
  46.     43  #
  47.     44  # assert target object in listed dirs
  48.     45  #
  49.       
  50.     46  echo "lists:${dirLists[@]}"
  51.       
  52.     47  #exit 1
  53.       
  54.     48  for var in ${dirLists[@]}
  55.     49  do
  56.       
  57.     50  echo "check:"$var
  58.       
  59.     51  #
  60.     52  # has found the target object
  61.     53  #
  62.     54  if [ ${flag1} -eq "1" ]
  63.     55  then
  64.     56  #exit 0
  65.     57  #break
  66.     58  return
  67.     59  fi
  68.     60  #
  69.     61  # search target object in current path
  70.     62  #
  71.     63  if [ ${var} = ${modelname} ]
  72.     64  then
  73.     65  echo "NOTE"
  74.     66  returndir="${targetPath}/${var}"
  75.     67  flag1=1
  76.     68  export flag1 returndir
  77.     69  #exit 0
  78.     70  #break
  79.     71  return
  80.     72  else
  81.     73  #
  82.     74  # search target object in sub-directory
  83.     75  #
  84.       
  85.     76  echo "targetPath:${targetPath}  var:${var}"
  86.     77  checkPathContainDir "${targetPath}/${var}" "${modelname}"
  87.     78  fi
  88.     79  done
  89.     80  #return
  90.     81  }
  91.       

  92.     82  checkPathContainDir "${IPNETVERSIONDATAPATH}" "${2}"
  93.     83  echo ${flag1}
  94.     84  echo ${returndir}
复制代码

许多输出是为了跟踪代码运行过程的:),大家给点意见。
作者: crifan    时间: 2012-06-14 14:49
谢谢各位前面的解释,加了local后,递归函数可以正常执行了。特此来感谢。
作者: ziyunfei    时间: 2012-06-14 15:49
挖坟




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2