我是TCL的初学者,在尝试构建GCD算法时遇到了一些我需要帮助的问题:
如何以递归方式调用proc中的proc,如此
proc Stein_GCD { { u 0 } { v 0 } } {
if { $v == 0 } {
puts "$u\t\t$v\t\t$v"
}
if { [expr { $v % 2 } && { $u % 2 } ] == 0 } {
return [expr 2 * ${Stein_GCD 1 0} ]
}
}
set a [Stein_GCD 2 2 ]
puts $a
正如你所看到的,我做了proc来评估GCD(代码没有任何意义,因为我试图解决一个示例问题),并且我试图递归调用proc再次继续评估(注意我做了一个if语句,可以理解Stein_GCD 1 0
调用,但是tcl 8.6.6在线EDA模拟器说:
can't read "Stein_GCD 1 0": no such variable while executing "expr 2 * ${Stein_GCD 1 0} " (procedure "Stein_GCD" line 5) invoked from within "Stein_GCD 2 2 " invoked from within "set a [Stein_GCD 2 2 ]" (file "main.tcl" line 7)
你能告诉我如何有效地递归调用proc,我的错误在哪里? 我很乐意提供更多信息,因为我在解释时做得不好。
答案 0 :(得分:3)
错误can't read "Stein_GCD 1 0":
表示您将数据视为单个字符串而不是单独的参数。问题在于:
return [expr 2 * ${Stein_GCD 1 0} ]
编写不正确。 ${Stean_GCD 1 0}
不是变量。
你应该:
return [expr 2 * [Stein_GCD 1 0] ]
您想要Stein_GCD 1 0
的结果,因此应使用括号。