AMcoder - javascript, python, java, html, php, sql

Ինչպե՞ս որոշել SML-ում ռեկուրսիվ ֆունկցիայի տարբերակը:

Ես որոշ դժվարություններ ունեմ հասկանալու, թե ինչ տարբերակներ են SML-ում և ինչպես եք որոշում ռեկուրսիվ ֆունկցիայի տարբերակը: Ես ստացա բացատրությունը.

«(Ռեկուրսիվ) ֆունկցիայի տարբերակն այն ցանկացած արտահայտություն է ֆունկցիայի արգումենտների վրա, որը արժեքներ է ընդունում որոշ A բազմության մեջ, որպեսզի

  • A-ն (ընդհանուր) պատվիրված է; ավելին, A-ում չկան անսահման իջնող շղթաներ v0 > v1 > ...; և
  • ցանկացած ռեկուրսիվ զանգի դեպքում տարբերակը խիստ նվազում է»։

Բայց դա ինձ այնքան էլ չօգնեց: Ավելի կոնկրետ օրինակը հիանալի կլիներ:

02.12.2013

Պատասխանները:


1

Ենթադրենք, որ ձեր ռեկուրսիվ ֆունկցիան կազմում է n երկարության ցուցակ, որտեղ բոլոր տարրերը զրո են:

Սա կարող է նման բան թվալ.

fun foo 0 = []
  | foo n = 0::(foo (n - 1))

Այս դեպքում տարբերակը n ֆունկցիայի արգումենտն է:
n-ը բնական թիվ է, և բնական թվերն ամբողջությամբ դասավորված են առանց անսահման նվազող շղթաների, քանի որ ոչ մի շղթա չի կարող զրոյից ցածր լինել:
Ավելին, n խստորեն նվազում է յուրաքանչյուր ռեկուրսիվ զանգի հետ:

Մեկ այլ օրինակ. Ենթադրենք, որ ձեր ֆունկցիան ընդունում է երկու արգումենտ՝ x և y, և վերադարձնում է true, եթե x > y, իսկ հակառակ դեպքում՝ false:

fun bar 0 y = false
  | bar x 0 = true
  | bar x y = bar (x - 1) (y - 1)

Այս դեպքում տարբերակի մի քանի տարբերակ կա. Դուք կարող եք այն ընդունել որպես x կամ y, ինչպես նախորդ օրինակում, կամ լինել x + y: Այս դեպքերից որևէ մեկում այն ​​ընդունում է բնական թվային արժեքներ և խիստ նվազում:

Այժմ, օրինակ, որտեղ արգումենտները ոչ ամբողջ թվեր են. գտնել ցուցակի գումարը:

fun sum [] = 0
  | sum (x::xs) = x + (sum xs)

Այս դեպքում տարբերակը կարող է ընդունվել որպես ցուցակի երկարություն (կրկին բնական թիվ), կամ լինել հենց ցուցակը, որտեղ ցուցակները դասավորված են հետևյալ կերպ.

l1 < l2 եթե կա x1,x2,...,xn տարրերի որոշակի վերջավոր հաջորդականություն, որ x1::x2::...::xn::l1 = l2:

Բավականին հեշտ է ցույց տալ, որ ցուցակների հավաքածուն մասամբ դասավորված է, առանց անսահման նվազող շղթաների, այս համեմատության ներքո, և, մասնավորապես, ցուցակների շարքը, որը ստեղծվել է ռեկուրսիվ զանգերի արդյունքում, սկսած ինչ-որ ցուցակից, ամբողջությամբ դասավորված է:

Ավելին, ցանկացած ռեկուրսիվ զանգի դեպքում՝ xs < (x::xs), ըստ սահմանման, ուստի ցուցակը նվազում է:

Տարբերակի իմաստն այն է, որ այն մեծություն է, որը կարող է ներարկվել ֆունկցիայի վարքագծի վերաբերյալ բաներ ապացուցելու համար: Քանի որ չկան անսահման նվազող շղթաներ, պետք է լինի նվազագույն տարր, որը կարող է ընդունվել որպես ինդուկցիայի հիմք, և այնուհետև ընդհանուր կարգը տալիս է ինդուկցիայի եղանակ՝ մեկ տարրից անմիջապես ավելի մեծ տարր:

Դա կարելի է անել նաև մասնակի կարգով, առանց անսահման նվազող շղթաների, ինչը երաշխավորում է նվազագույն տարրերի առկայության, եթե ոչ պարտադիր նվազագույն տարրերի առկայության դեպքում: Այնուհետև դրանք կարող են օգտագործվել որպես բազային դեպքեր, և նման ինդուկցիոն փաստարկ ներկայացնել, թեև հավանական է ավելի մեծ տարրեր կառուցելու բազմաթիվ եղանակներով:

02.12.2013
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..