首页 > 解决方案 > 没有显式返回的递归 TCL proc

问题描述

我正在编写一个简单的“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

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

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

我预计如果没有明确的“返回”,该函数也应该返回 24。

标签: recursiontcl

解决方案


你的预期是正确的。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}                                                                                                                                                           
}

推荐阅读