TCL递归调用程序

时间:2017-10-28 17:10:42

标签: recursion tcl procedure

我是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,我的错误在哪里? 我很乐意提供更多信息,因为我在解释时做得不好。

1 个答案:

答案 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的结果,因此应使用括号。