73 lines
1.8 KiB
Tcl
73 lines
1.8 KiB
Tcl
package require Tcl 8.6
|
|
|
|
# Create a coroutine for generating Padovan sequence using lazy evaluation
|
|
proc pad_recur {{n 1}} {
|
|
set p1 1
|
|
set p2 1
|
|
set p3 1
|
|
set p4 1
|
|
for {set i 1} {$i <= $n} {incr i} {
|
|
set next [expr {$p2 + $p3}]
|
|
yield $p1
|
|
set p1 $p2
|
|
set p2 $p3
|
|
set p3 $p4
|
|
set p4 $next
|
|
}
|
|
}
|
|
|
|
proc pad_floor {n} {
|
|
set p 1.32471795724474602596
|
|
set s 1.0453567932525329623
|
|
if {$n < 3} {
|
|
return 1 ;# The first three elements should be 1, so return 1 for n < 3
|
|
} else {
|
|
return [expr {int(0.5 + pow($p, double($n)-2) / $s)}]
|
|
}
|
|
}
|
|
|
|
# Main variables
|
|
set l 10
|
|
set m 20
|
|
set n 32
|
|
|
|
# Generating Padovan sequence using recursive coroutine
|
|
set pr [list]
|
|
set pad_recur_coro [coroutine pad_recur_co pad_recur $n]
|
|
for {set i 1} {$i <= $n} {incr i} {
|
|
lappend pr [pad_recur_co]
|
|
}
|
|
puts [join [lrange $pr 0 [expr {$m - 1}]] " "]
|
|
|
|
# Generating Padovan sequence using floor function
|
|
set pf [list]
|
|
for {set i 1} {$i <= $n} {incr i} {
|
|
lappend pf [pad_floor $i]
|
|
}
|
|
puts [join [lrange $pf 0 [expr {$m - 1}]] " "]
|
|
|
|
# Generating L-system sequence
|
|
set L [list "A"]
|
|
set rules [dict create A B B C C AB]
|
|
for {set i 1} {$i <= $n} {incr i} {
|
|
set last [lindex $L end]
|
|
set expansion ""
|
|
foreach char [split $last ""] {
|
|
append expansion [dict get $rules $char]
|
|
}
|
|
lappend L $expansion
|
|
}
|
|
puts [join [lrange $L 0 [expr {$l - 1}]] " "]
|
|
|
|
# Comparison of all three methods, adjusting for zero-indexing
|
|
for {set i 0} {$i < $m} {incr i} {
|
|
set pr_val [lindex $pr $i]
|
|
set pf_val [lindex $pf $i]
|
|
set L_len [string length [lindex $L $i]]
|
|
if { $pr_val != $pf_val || $pr_val != $L_len } {
|
|
error "Uh oh, n=$i: $pr_val vs $pf_val vs $L_len"
|
|
}
|
|
}
|
|
|
|
puts "100% agreement among all 3 methods."
|