Atbilde 1:

Neskatoties uz to, ko saka citas atbildes, jā. Programmētāji nozīmē kaut ko mazliet savādāku ar terminu “rekursija” nekā matemātiķi.

Bet precīzāk, ne tīru valodu programmētāji nozīmē kaut ko mazliet savādāku nekā tīru valodu programmētāji, kad viņi lieto terminu “rekursija”. Kaut arī tīru valodu programmētāji nozīmē tieši to pašu, ko matemātiķi.

Un galvenais iemesls ir tas, ka programmētāji un matemātiķi nozīmē “funkciju” kaut ko atšķirīgu.

Matemātikā “funkcija” vienmēr ir tīra - tā ir tikai kartēšana no argumentiem uz rezultātiem, un katru reizi, kad jautāt par funkcijas rezultātu, izmantojot dažus argumentus, rezultāts ir vienāds. Ja jums ir Fibonači rekursija f (n) = f (n-1) + f (n-2), varat droši izmantot f (n-2) vērtību kā koeficientu f (n) definīcijā un f (n-1) definīcijā. Tā ir precīzi tāda pati vārda “function” nozīme kā vārdam “function” tīrā programmēšanas valodā - jūs varat rakstīt

f n = ja n <= 1
tad 1
cits f (n-1) + f (n-2)

Haskellā (jā, es apzinos, ka nav tā, kā jums to vajadzētu rakstīt Haskellā, bet es vairāk izvēlos pazīstamību lietotājiem, kas nav Haskell lietotāji), un šis kods darbosies O (n). Tas darbosies O (n), jo f ir tieši šī vārda “funkcija” matemātiskā nozīmē, ti, f (n) vienmēr ir tā pati tīrā vērtība dotajam n, tāpēc reizi f (i) rezultāts tiek aprēķināts Pirmo reizi to var atkārtoti izmantot visur citur, neizmantojot aprēķinu.

Un iepriekš definētajai Haskell “rekursijai” ir tieši tāda pati nozīme kā matemātiskajai “rekursijai” f (n) = f (n-1) + f (n-2).

No otras puses, valodā, kas nav tīra, jēdziena “funkcija” nozīme ir atšķirīga, jo funkcijas kopums var radīt blakusparādības. Tātad, ja es rakstu

int f (int n) {
ja (n <= 1) atgriežas 1;
atgriešanās f (n-1) + f (n-2);
}

C ++ / Java / etc šī ir “rekursijas” atšķirīga nozīme nekā Haskell piemērā. Šī ir rekursija, kas izsauks f pa katrām n reizēm, iegūstot kopējos O (2 ^ n) zvanus. Tas ir tāpēc, ka, ja ar “funkciju” mēs domājam procedūru, mums tā jāpiesauc divreiz, ja tā divreiz parādās rekursijas ķermenī.

Tas, ko neattīrītu valodu programmētāji nozīmē “funkcija”, ir procedūra, kas rada [iespējams] zināmu rezultātu un veic [iespējams] dažas blakusparādības. Procedūra pati par sevi ir svarīga (jo tai var būt blakusparādības), un programma, kas izsauc procedūru divreiz pēc vieniem un tiem pašiem argumentiem, var radīt atšķirīgu vērtību nekā programma, kas to sauc vienreiz. Tā kā rekursija notiek tad, kad funkcija ir atkarīga no paša, tas nozīmē, ka rekursija ir situācija, kad procedūra tiek izsaukta pati un [iespējams] izmantots rezultāts.

Tas, ko tīro valodu programmētāji un matemātiķi nozīmē “funkcija”, ir tīras procedūras rezultāts (bez blakusparādībām), un līdz ar to pati procedūra nav nozīmīga, jo tā ir “tikai” tīra rezultāta iegūšanai. Tātad “rekursija” nozīmē tikai rezultātus, kas atkarīgi viens no otra, nevis pašas funkcijas definīcijas “zvanus”.

Tā kā tīras valodas ir reti sastopamas un ļoti tīras ir ļoti izplatītas valodas, tas ir diezgan drošs vispārinājums, lai vienkāršotu situāciju ar vārdiem “programmētāji nozīmē kaut ko savādāku nekā matemātiķi”.


Atbilde 2:

Neierobežota atbilde šeit:

Apskatot matemātikas un aprēķinu salīdzinājumu (vai, kā jūs sakāt, “programmēšana”), jūs atradīsit “kravu, kuru var nēsāt ēzelis un kas tiek pakļauta metrikācijai”. Tas ir dzimis kaut kur ar nosaukumu Karija – Hovarda sarakste - Wikipedia, kurā teikts, ka matemātika un aprēķini ir gandrīz sinonīmi. Turklāt, kad mēs nonākam līdz homotopija tipa teorijas un universāluma aksiomas kāpnēm, jūs varat sākt domāt, ka atbilstība notiek no ģeometrijas, aprēķiniem, teorijas iestatīšanas un lielākās daļas matemātikas.

TL; DR: Tie ir līdzvērtīgi, pat ja runā par nedaudz atšķirīgu lietojumu.


Atbilde 3:

Vai programmētāji un matemātiķi domā kaut ko atšķirīgu, runājot par “rekursiju”?

Es tā nedomāju.

Paturot prātā, ka pirmie ļaudis, kas attīstīja datorzinātnes - Tēringa, Baznīca, Gēdela utt., Bija matemātiķi.

Kaut arī Gēdels galvenokārt ir pazīstams ar savām nepabeigtības teorēmām, viņš paveica milzīgu darbu pie rekursīvo funkciju teorijas. Viņš mēģināja atrisināt to pašu problēmu (no Deivida Hilberta), kas bija Tēringa viņa slavenajā darbā, un būtībā izmantoja vispārējās rekursīvās funkcijas kā sava risinājuma pamatu. Vispārējās rekursīvās funkcijas ir aprēķināšanas paraugs, un tādējādi ir cieši saistītas ar datorzinātnēm un programmēšanu.

Es domāju, ka grūtības rada tas, ka vairums programmētāju, īpaši tie, kuriem nav datorzinātņu fona, neredz saistību starp rekursīvas definīcijas matemātiku, piemēram:

F0=F1=1Fn=Fn1+Fn2F_0 = F_1 = 1\\
F_n = F_{n-1} + F_{n-2}

un rekursīvas funkcijas definīciju, piemēram

def fib (n)
  ja n == 0 || n == 1
    1
  cits
    fib (n-1) + fib (n-2)
  beigas
beigas

Funkcionālajā valodā, piemēram, Haskell, tas ir skaidrāks:

fib :: Nat -> Nat
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

bet tas daļēji tāpēc, ka Haskell tika izveidots, lai attiecības padarītu skaidrākas.

Protams, ir grūtāk redzēt attiecības, kad programmēšanas piemērs ir garāks, taču tas tur pamatā ir.

Tas, protams, nāk no nometnes “Bet programmēšana ir matemātika!”.


Atbilde 4:

Vai programmētāji un matemātiķi domā kaut ko atšķirīgu, runājot par “rekursiju”?

Es tā nedomāju.

Paturot prātā, ka pirmie ļaudis, kas attīstīja datorzinātnes - Tēringa, Baznīca, Gēdela utt., Bija matemātiķi.

Kaut arī Gēdels galvenokārt ir pazīstams ar savām nepabeigtības teorēmām, viņš paveica milzīgu darbu pie rekursīvo funkciju teorijas. Viņš mēģināja atrisināt to pašu problēmu (no Deivida Hilberta), kas bija Tēringa viņa slavenajā darbā, un būtībā izmantoja vispārējās rekursīvās funkcijas kā sava risinājuma pamatu. Vispārējās rekursīvās funkcijas ir aprēķināšanas paraugs, un tādējādi ir cieši saistītas ar datorzinātnēm un programmēšanu.

Es domāju, ka grūtības rada tas, ka vairums programmētāju, īpaši tie, kuriem nav datorzinātņu fona, neredz saistību starp rekursīvas definīcijas matemātiku, piemēram:

F0=F1=1Fn=Fn1+Fn2F_0 = F_1 = 1\\
F_n = F_{n-1} + F_{n-2}

un rekursīvas funkcijas definīciju, piemēram

def fib (n)
  ja n == 0 || n == 1
    1
  cits
    fib (n-1) + fib (n-2)
  beigas
beigas

Funkcionālajā valodā, piemēram, Haskell, tas ir skaidrāks:

fib :: Nat -> Nat
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

bet tas daļēji tāpēc, ka Haskell tika izveidots, lai attiecības padarītu skaidrākas.

Protams, ir grūtāk redzēt attiecības, kad programmēšanas piemērs ir garāks, taču tas tur pamatā ir.

Tas, protams, nāk no nometnes “Bet programmēšana ir matemātika!”.