【问题标题】: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]
同样的方法。