【问题标题】:tcl fibonacci series in recursive递归的tcl斐波那契数列
【发布时间】:2016-11-24 12:42:48
【问题描述】:

我试过这不起作用...有人可以帮忙吗?想知道逻辑错误或语法。提前致谢。

#*********************************************

puts "Fibbonocci sequence"

proc fibb {size} {
        if { $size == 1 || $size ==0 } {
                return $size
        } else {
                return [expr fibb [expr $size - 1] + fibb [expr $size - 2]]
        }

}
puts "Enter the length of the series:"

set n [gets stdin]

puts "Fibbonocci sequence upto $n terms are:"
puts [fibb $n]


#**********************************************

【问题讨论】:

    标签: recursion tcl fibonacci


    【解决方案1】:

    问题出在这一行:

    return [expr fibb [expr $size - 1] + fibb [expr $size - 2]]
    

    实际上,这有几个问题。首先是表达式没有大括号:

    return [expr { fibb [expr { $size - 1 }] + fibb [expr { $size - 2 }] }]
    

    第二个问题是你必须在外部表达式中调用 fibb 作为 Tcl 命令,所以需要更多 [brackets]

    return [expr { [fibb [expr { $size - 1 }]] + [fibb [expr { $size - 2 }]] }]
    

    将其插入正确的位置,您的其余代码应该可以工作...... 但是我们可以通过将fibb 转换为函数来更优雅。 Tcl 中的函数实际上只是位于正确命名空间tcl::mathfunc 中的命令。

    proc tcl::mathfunc::fibb {size} {
        if { $size == 1 || $size ==0 } {
            return $size
        }
        return [expr { fibb($size-1) + fibb($size-2) }]
    }
    

    然后你调用它,比如:

    puts [expr { fibb($n) }]
    

    唯一的不同之处在于,我们将命令(即过程)放在了正确的命名空间中,以便它充当表达式组件。而且我们仍然在表达式周围加上大括号(请始终这样做,直到您至少理解它的重要性)并稍微简化了代码。

    另外,你仍然可以直接调用它:

    puts [tcl::mathfunc::fibb $n]
    

    同样的方法。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2012-11-19
      • 2016-11-07
      • 2012-02-16
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多