没有显式 return 的递归 TCL 过程

Recursive TCL proc without explicit return

我正在编写一个简单的 "proc" 来计算阶乘。我想了解为什么我的函数在没有 return 语句的情况下不起作用。

根据 TCL 文档,未明确定义的函数 "return", return 其主体中最后执行的命令的值。

    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

删除 "return" 后,我收到以下错误消息:

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

我预计如果没有明确的 "return",函数也应该 return 24。

您的期望是正确的。但是你在最后一行的 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}                                                                                                                                                           
}