2016-11-24 48 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] 

這會工作得同樣的方式。