C while for..for....for

Miroslav Mraz mrazik na volny.cz
Pátek Leden 27 10:02:34 CET 2023


To není nejlepší příklad. Jdete hrubou silou na něco, co jde udělat i 
jinak. Ve své podstatě hledáte nejlepší aproximaci reálného čísla číslem 
racionálním - zlomkem. Na to existuje metoda řetězového zlomku, z níž 
vycházejí postupně lepší a lepší aproximace, ale čitatel i jmenovatel se 
postupně zvětšuje. Pokud tato čísla rozložíte na součin prvočísel, 
vidíte jak je nejlépe seskupit tak, aby vám to dalo rozumné počty zubů.
Na rozdíl od hrubého násilí vidíte víc přijatelných výsledků, ze kterých 
si pak vyberete ten pro vás nejrozumnější.

Ale zpět k původnímu dotazu. Někdy bývá lepší převést cyklus na rekurzi. 
Kód může pak být o hodně kratší, i když o přehlednosti by bylo možné 
diskutovat. Já osobně se v tom obvykle stejně zamotám, ale jsou úlohy 
(např. řešení sudoku), kde se to fakt hodí. Pokud je rekurze dělána 
rozumně (tail recursion), překladač si to interně stejně předělá na 
cyklus. MISRA ovšem rekurzi také zakazuje - může vyčerpat zásobník.

Mrazík

On 26. 01. 23 23:28, Aleš Procháska wrote:
> Přehlednost kódu pro případné další úpravy je myslím skoro stejně důležitá jako správnost a když rozstrkám do funkcí to, co přirozeně nevyjadřuje nějakou myšlenku, přehlednosti moc nepomůžu. Zcela konkrétní příklad (reálně naprogramovaný a taky s goto): najít čtveřici ozubených kol, která budou realizovat určitý převod. Je to komplikované tím, že se vyrábějí pouze kola s celočíselným počtem zubů, takže se musí zkusmo procházet ve čtyřech vnořených cyklech až se trefím. Pak goto za konec vnějšího cyklu a mám čtyři indexy označující čtyři hledaná kola. Kdybych na to psal nějakou ad hoc funkci kterou už v programu nikde jinde nepoužiju, tak musím taky vyřešit, jak vrátit čtveřici čísel. Čili nějaký struct nebo co, ještě ta funkce a z pár řádků jsou dvě obrazovky a tušené nadávky někoho (mě samého za rok) kdo se bude snažit pochopit co to vlastně dělá. Kdybych už v tom nutně musel hledat hnidy, tak bych se začal navážet do samotného céčka, proč řídicí proměnné cyklu for existují i mimo tělo cyklu a proč tam není pojmenovaný exit z cyklu :-)
> 
> Aleš Procháska
> 


Další informace o konferenci Hw-list