tcl斐波那契数列的递归

时间:2016-11-24 12:42:49

标签: recursion tcl fibonacci

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

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

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]


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

1 个答案:

答案 0 :(得分:4)

问题在于这一行:

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

实际上,这有几个问题。首先是表达式没有被支撑:

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

第二个问题是你必须在该外表达式中调用fibb作为Tcl命令,因此需要更多[括号]

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]

这将以同样的方式运作。

相关问题