ormorph пишет:Доктор почему? На СИ этот код так же загружает процессор, просто вызовы интерпретируемого языка на много сложнее, от сюда и потеря производительности.
не только в этом всё дело. Хотя и это тоже.
Но не это главное.
ormorph пишет:
int64_t fib_iter (int64_t a, int64_t b, int64_t count){
if (count==0) return b;
return fib_iter((a+b), a, (count-1));
}
функционально программирование съёло ваш мозг.
отловите любого школьника, и попросите решить эту задачу. Он её решит без всякого стека
0
1
0+1=1
1+1=2
1+2=3
2+3=5
и так далее.
Как видите, на каждую итерацию нужно всего два слова. Вы зачем-то используете N слов. Точнее, вы используете N+N*M слов. Здесь M это длинна результата в словах (в предположении, что она растёт линейно, это не совсем так, но для простоты расчётов это допустимо).
Т.е. для каждой итерации у вас в стеке сохраняется не только адрес возврата, но ещё и прошлый с позапрошлым результатов. Как вы уже поняли, результаты тут имеют совсем не маленький объём. И самый простой, процедурный подход требует только двух переменных для данных. Ну а функциональный - N переменных.
Для N == 10000 у вас получилось число в 2090 цифр
это
26455354C816C43235B9A5B9708A80EC209E5A36521B054E1F08B364AC5F9EA8A618\
BA6203D6598679F82A57B25E5727326C1BEC42026ED6BB5E577D20563519B1086FA7\
8E79A13DF45829FA84BFD0AB6F0B2DBEB34CDD8BE556F2BA12DC96342BC50CD1C313\
479C2C83AFDFDD28C1F9FCFF8EE23EEEE443349BA0964E0AA29F35941217D12487CE\
CACDC9CCC9B77D11D14F72BCCC265FD0FE7F831747EBE7634B9A246915F996315C79\
DE01E48EFA8A52CAAE6BE757783411BE20664AB19D18CC63AF13E623895D5C879D5F\
3B1D5768317FBF95DC91FBF8402131015E5F5154F3B14DCFDA6C3E88BABEE1BA1173\
94C9EE4360096BDF6650209D8005BCC5E2459072F8066895C7331F271051F2830EDD\
CC8A0102DF15711544823B820D863EC63AB8ED88A777D4C7CFED7563DAB155C06D05\
7C0BACB621E2D50B7A655E647EA443C8555005BB5D7066096A2E811D53571E24181D\
FE37FF0979AF3B063B133BDC511FE7FC3E71C74D2529F1E6C218F213EECF09A09194\
857B1130A3E8DFD9CF3B38E6A18A68103C4698D3E014DC8D6D59EC1C6D2478BD16E4\
2A20FBCB81B03C86470AFE986FE20AD2C54706CD01D198BCC78BF5A0B0C6FA15C258\
5647635F965925246AF87C8D05CC0F072355F3D31867944AEF1C0AD65B32DA8121EB\
BC36AC1A3554BEE17AB8E680DB4C6F305AE9836CA2B8BEEB64D2B1BD5F6B801139AE\
B8298BF53AE4EEA0B4237965F95C6CBC92F5BE3427CBD0B2E8771C54B578032F865C\
D74E66CB093D51B51F808308B71FCAFE88250528A3F5D1E308A1A9CE9872547FA5AC\
C2CF434B9503B368066143606EA5458B0B9ED1538A465EAA4638A340B8AB274AAAC0\
60A56F2D2FA639B7A8CBF00ADAD2286AB2B299C9ADF471647736E8B97B5A6F8781CF\
0707617BE5570BB649C47E122F6D4781BF97BC02BFBDF59D558820DF190348081A30\
28FA2F3EFBF486D2F69AEB5C8FB963F27BF01300F047E4989C9CAD353A1EE19AA207\
52F5789EA65AAEFC62DD5F836456C17B08B5194C682118570AEBDFECD446A1F63AE2\
61A299C23C6AB19E7B2758E4FE91D35D8FE1D5DFF7359FB73A5DEDB172765B205628\
AC2DCF0DE6865874CCC0CB5369623FB3E96F09A07D07F4753F50034CCACE3542ED83\
D69BBD346E43A1D4BF5C229A116B35F9F98E4C8752CA26035035F30F7DB929B9C06F\
A898222219DEE5079FAAD824476D4A0819DB
1736 тетрад
или 217 слов на x86_32
Т.е. при N=10000, вам потребуется примерно 2 180 000 слов. А мне всего 434. Как говорится - почувствуйте разницу.
На самом деле, функциональное программирование работает только на простых, тестовых примерах - даже в нашем тривиальном случае вам пришлось найти почти 9 мегабайт. И это в Си! Не сомневаюсь, что ваша программа на lisp'пе пожрёт не 9, а 99 метров. И это тогда, когда простой тупой подход требует жалких двух килобайт.
Вы всё ещё пишете на функциональных ЯП? :lol:
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)