2016-11-24 67 views
1

我试过这个不行......任何人都可以帮忙吗?想知道逻辑错误或语法。提前致谢。递归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] 


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

回答

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中的函数实际上只是位于右侧名称空间0123,中的命令。

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] 

这会工作得同样的方式。