2016-11-24 4 views
1

Я пробовал это не работать ... Может ли кто-нибудь помочь, пожалуйста? Хотите знать логическую ошибку или синтаксис. Заранее спасибо.tcl серия фибоначчи в рекурсивном

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

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 - это действительно просто команды, которые живут в правильном пространстве имен, 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] 

Это будет работать точно так же.

Смежные вопросы