recursion - 没有显式返回的递归 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。
解决方案
你的预期是正确的。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}
}
推荐阅读
- c - linux内核中的TCP snd_cwnd
- c# - 有没有办法启动添加到解决方案中的 .exe 文件
- react-native - 反应本机模式错误评估_this5.state.error[key]
- excel - Excel VBA 生成的标题在不同的 PC/Office 上不一样
- java - 为什么我无法在 saveChanges 中获取标题流
- vue.js - 使用传递给多个子组件的道具的最佳方式
- r - 使用列表传递数据框名称时出现意外结果
- spring - Spring缓存@Cacheable和@CachePut。如果@cachePut方法内部抛出异常,则从Cache中获取数据
- c# - 当 Dragon NaturallySpeaking 的 MouseGrid 打开时,C# 保持下拉菜单打开
- json - 如何在本地使用 reactNative 获取 name.json 文件?