请帮助我简单的 tcl 代码

Please help me with the simple tcl code

这是一个简单的代码,当一个数字被提升到另一个数字时给出输出number.But它总是返回数字的平方而不是循环。 请大家帮忙

#!/usr/bin/tclsh
proc raise {{base} {pow} args} {
for {set base1 $base} {$pow >= 0} {incr $pow -1} {
set ans [expr $base * $base1 ]
set base $ans
return $ans
}
}

只是第一眼的回答:你 return 是不是太早了?

#!/usr/bin/tclsh
proc raise {{base} {pow} args} {
  for {set base1 $base} {$pow >= 0} {incr $pow -1} {
    set ans [expr $base * $base1 ]
    set base $ans
  }
  return $ans
}

您允许循环最多进行 1 次迭代。这是因为 return 退出当前的 proc (循环也是自动的)。

修复该部分将得到:

#!/usr/bin/tclsh
proc raise {{base} {pow} args} {
    for {set base1 $base} {$pow >= 0} {incr $pow -1} {
        set ans [expr $base * $base1 ]
        set base $ans
    }
    return $ans
}

但是..这并不能完全给你答案,是吗?您的代码逻辑不太正确。我觉得应该是:

proc raise {base pow} {
    for {set base1 $base} {$pow > 1} {incr pow -1} {
        set ans [expr {$base * $base1}]
        set base $ans
    }
    return $ans
}

incr取一个变量名,不是变量,你想迭代直到幂在1以上。如果它是 1,那么你得到基数,因此你不会循环。最后更改为 brace the expressions. To make the above work for powers of 0 as well, you can use .

但是话虽如此,您为什么不为此使用内置运算符?

set ans [expr {$base**$pow}]

甚至:

set ans [expr {pow($base,$pow)}]

一个稍微不那么混乱的解决方案,它也给出了 $pow = 0 的正确答案:

proc raise {base pow} {
    for {set answer 1} {$pow > 0} {incr pow -1} {
        set answer [expr {$answer * $base}]
    }
    return $answer
}

在试验代码时,少用变量和命令调用通常很有用:当您确定不能再删除它们时,您可能拥有相当高效、可读且健壮的代码.

文档:expr, for, incr, proc, return, set