没有显式 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}
}
我正在编写一个简单的 "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}
}