没有明确返回的递归TCL proc

时间:2019-07-17 19:14:15

标签: recursion tcl

我正在编写一个简单的“ proc”来计算阶乘。我想了解为什么没有return语句我的函数将无法工作。

根据TCL文档,定义的函数无需显式的“返回”, 返回其主体中最后执行的命令的值。

    proc fac { n } {
       if { $n == 1 } {
         return 1
       } 
    puts $n
    set n [expr {$n - 1}]
    return [expr {[fac $n ] * $n}]                                                                                                                                                            
    }
    puts [fac 5] # ans 24

删除“返回”后,出现以下错误消息:

    invalid command name "1"
      while executing
     "[expr {[fac $n ] * $n}] "
        (procedure "fac" line 7)
        invoked from within

我希望没有显式的“返回”,该函数也应返回24。

1 个答案:

答案 0 :(得分:2)

您的期望是正确的。但是最后一行的expr过程周围有方括号。是:

[expr {[fac $n] * $n}]

对于解释器来说,这意味着:1)用给定的参数执行expr过程; 2)执行expr过程的结果。因此,解释器尝试执行不存在的过程1,并且您收到错误。

要解决此错误-只需从最后一行删除方括号即可:

proc fac { n } {
   if { $n == 1 } {
     return 1
   } 
   puts $n
   set n [expr {$n - 1}]
   expr {[fac $n ] * $n}                                                                                                                                                           
}