我试图理解TCL中的递归,但每次递归完成时都会抛出错误

问题描述 投票:0回答:1

我是 TCL 新手,正在尝试设置一个简单的递归循环。我的代码一直运行到递归完成为止,然后它开始抛出错误。这是我的代码:

set testNum 0

proc raiseTest { a } {
    puts $a
    if { $a == 5 } {
        puts "Done!"
    } elseif { $a != 5 } {
        incr a
        puts "Going!"
        [raiseTest $a]
    } 
    
}

[ raiseTest $testNum ]

一旦 proc 达到 5 并完成最后一个循环,我就会遇到 invalid command name "" 错误,然后是大量 invoked from inside 错误,我不知道为什么。有人可以帮我吗?

loops recursion tcl procedure proc
1个回答
0
投票

有两件事

  1. 调用过程时不使用方括号。仅当需要捕获过程的返回值时才使用方括号,但在本例中不是这样
  2. elseif {$a != 5}
    是多余的,您可以将其替换为
    else

为了进一步讨论第 1 点,

puts "Going!"
之后的一行,内容为:

        [raiseTest $a]

此行调用

raiseTest $a
,然后由于方括号,捕获该调用的输出(空字符串,因为没有返回任何内容)并将其用作过程的名称并调用它。

这是一个例子:

proc foo {} {
    puts "foo"
    return "bar"
}

proc bar {} {
    puts "bar"
}

foo    ;# prints "foo"
[foo]  ;# prints "foo", then "bar""

话虽这么说,代码应该如下所示,删除方括号:

proc raiseTest { a } {
    puts "a=$a"
    if { $a == 5 } {
        puts "Done!"
        return
    } else {
        incr a
        puts "Going!"
        raiseTest $a
    }
    puts "Exiting, a=$a"
}

set testNum 0
raiseTest $testNum
© www.soinside.com 2019 - 2024. All rights reserved.