【问题标题】:TCL recursively call procedureTCL递归调用程序
【发布时间】:2018-04-10 01:57:03
【问题描述】:

我是 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 以继续评估(请注意,我做了一个可以理解 Stein_GCD 1 0 调用的 if 语句,但是 tcl 8.6.6 在线 EDA 模拟器说:

无法读取“Stein_GCD 1 0”:没有这样的变量 在执行时 “expr 2 * ${Stein_GCD 1 0}” (程序“Stein_GCD”第 5 行) 从内部调用 “斯坦_GCD 2 2” 从内部调用 “设置一个 [Stein_GCD 2 2]” (文件“main.tcl”第 7 行)

您能告诉我如何有效地递归调用 proc,我的错误在哪里?
如果我在解释方面做得不好,我很乐意提供更多信息。

【问题讨论】:

  • 除此之外,就风格而言,您最好为内部if 调用写if {!(($v % 2) && ($u % 2))} {;它既更有效也更清晰。而且我猜你需要做更多的工作来处理其他递归情况......

标签: recursion tcl procedure


【解决方案1】:

错误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的结果,所以应该使用括号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多