Проблема эта линия:
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]
Это будет работать точно так же.