Tcl - создание списка из случайных чисел

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

advancon
Junior
Posts: 3
Joined: 13 Mar 2017 15:41

Tcl - создание списка из случайных чисел

Post by advancon »

Условия задачи следующие:
Ввод длины списка N - создаётся список соответствующей длины,
без 0, без повторов, без лакун.
Например - N = 7 -> {3 7 2 6 1 5 4}
Вот что есть на сегодняшний момент:

Code: Select all

[color=#0000BF]proc Vvod {a} {
   global t
   puts stdout { Vvedite a:}
   set a [gets stdin]
   set t [format "%d" $a] 
}
proc Ldelete {list value} {
    set ix [lsearch -exact $list $value]
	if {$ix >= 0} {
	   return [lreplace $list $ix $ix]
	} else {
       return $list
    }
}
proc Spisok {t} {
for {set i 1} {$i <= $t } {incr i} {
	 set j [expr {round(rand()*$t)}]
     if {$j == 0} {
	 set k [expr {$j + 1}]
} else {
     set k $j
    }	
     lappend order $k	
}	 
foreach valume $order {
set m [lsearch -all $order $valume]
set y [lrange $m 1 end]
foreach val $y { 
lset order $val X
          }
set order [Ldelete $order X]		 
      }
puts stdout "order = $order"   
return $order	  
  }	 
proc !Spisok {t order} {
    set dlina [llength $order]
    if {$dlina < $t} {
	set order1 [Spisok [expr $t - $dlina]]
	set dlina2 [llength $order1]
	set order [concat $order $order1]
	set dlina [expr $dlina + $dlina2]
	!Spisok  $dlina  $order
} else {
    return $order
   }
}
while 1 {
Vvod a
set order [Spisok $t]
set x [!Spisok $t $order]
puts stdout "x = $x"   
}[/color]
Попытался сделать рекурсию (proc !Spisok), каждый раз выполняется два раза, т.е. нету рекурсии :osad:
Просьба объяснить в чём недоработка ... :idea:
P.S. Бессонница..., и SpaceX в 8.10!
advancon
Junior
Posts: 3
Joined: 13 Mar 2017 15:41

Re: Tcl - создание списка из случайных чисел

Post by advancon »

Code: Select all

  proc Vvod {a} {
       global t
       puts stdout { Vvedite a:}
       set a [gets stdin]
       set t [format "%d" $a] 
    }
  proc Ldelete {list value} {
        set ix [lsearch -exact $list $value]
        if {$ix >= 0} {
           return [lreplace $list $ix $ix]
        } else {
           return $list
        }
    }
  proc Bez_X {order} {	
    foreach valume $order {
      set m [lsearch -all $order $valume]
      set y [lrange $m 1 end]
    foreach val $y { 
      lset order $val X
              }
      set order [Ldelete $order X]         
    }	
	  return $order
}		  
  proc Spisok {t} {
    for {set i 1} {$i <= $t } {incr i} {
      set j [expr {round(rand()*$t)}]
    if {$j == 0} {
      set k [expr {$j + 1}]
}   else {
      set k $j}   
      lappend order $k  
    }
	  return $order
}      
    while 1 {
    Vvod a
	if {t == n} {
	  break}
	  set order [Spisok $t]
  	  set order [Bez_X $order]
  	for {set j 1} {$j <= $t } {incr j} { 
      set order [Bez_X [lappend order $j]]   
         }
      puts stdout "order = $order"   
}