টারজানের সিউডোকোড কীভাবে কাজ করে (সি বা জাভার সাথে পরিচিত কাউকে ব্যাখ্যা করেছেন)?


40

ছোট গল্প

বিখ্যাত কম্পিউটার বিজ্ঞানী, টারজন বহু বছর আগে একটি বই লিখেছিলেন। এটিতে একেবারে উদ্ভট সিউডোকোড রয়েছে। কেউ দয়া করে এটি ব্যাখ্যা করবেন?

দীর্ঘ গল্প

Tarjan সত্য যে তিনি coinventor ছিল সহ অনেক শিক্ষাদীক্ষা, জন্য পরিচিত হয় চ্যাটালো গাছ । তিনি ১৯ Data০ এর দশকে " ডেটা স্ট্রাকচারস এবং নেটওয়ার্ক অ্যালগরিদম " বই প্রকাশ করেছিলেন।

টারজানের বইয়ের সিউডো কোডের সবকটিই তার নিজস্ব ভাবাবেগের ভাষায় লেখা। সিউডো-কোড কনভেনশনগুলি খুব সুসংহত হয়। এটি প্রায় একটি সত্য ভাষা, এবং কেউ এর জন্য একটি সংকলক লেখার কল্পনা করতে পারে। তারজান লিখেছেন যে তাঁর ভাষা নিম্নলিখিত তিনটি উপর ভিত্তি করে:

আমি আশা করছি যে উপরোক্ত ভাষার একটি বা দু'জনের সাথে পরিচিত কেউ বা টার্জনের কাজটি আমার প্রশ্নের উত্তর দিতে সক্ষম হবে।

টার্জনের ভাষায় রচিত একটি ফাংশনের উদাহরণ নীচে দেখানো হয়েছে:

heap function mesh (heap nodes h1, h2);

    if key(h1) > key(h2) → h1 ⟷  h2 fi;

    right (h1) := if right(h1) = null → h2

                  |right(h1) ≠ null → mesh (right(h1), h2) fi;

    if rank (left (h1)) < rank (right (h1)) → left(h1) ⟷ right(h1) fi;

rank (h1) := rank(right(h1)) + 1;

return h1,

end mesh;

আমি প্রচুর সিউডো-কোড দেখেছি, তবে টার্জনের মতো কিছুই আমি কখনও দেখিনি। টারজানের সিউডোকোড কীভাবে কাজ করে? টারজানের সিউডোকোডের উদাহরণগুলি সি বা জাভার মতো দেখতে এমন কিছু হিসাবে কীভাবে পুনরায় লেখা যেতে পারে? এটি এমনকি সি বা জাভা হওয়া প্রয়োজন। টার্জনের ভাষায় যদি-অন্য নির্মাণগুলি কেবল সি-পারিবারিক ভাষা থেকে পৃথক নয়, তবে পাইথন, ম্যাটল্যাব এবং আরও অনেকের থেকেও আলাদা।


6
বিশেষত, আপনি কি বুঝতে পারছেন না? সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের কী ব্যাখ্যা বইতে দেওয়া হয়েছে?
রাফায়েল

8
আপনি কোথাও থেকে নমুনাটি অনুলিপি করেছেন বা নিজেই প্রতিলিপি করেছেন? ফাংশন বডিটির শেষ দুটি রেখা কি আসলেই বেশি ইন্টেন্টেড নয়? এবং returnবিবৃতিটি কি আসলেই কমাতে শেষ হয়?
বার্গি

উত্তর:


63

সুচিপত্র

আমি টার্জনের সিউডোকোড সম্পর্কে আমার ব্যাখ্যাটি নিম্নলিখিত বিভাগগুলিতে ভাগ করব :

  1. Tarjan এর if-আর অবরোধের ( ->& |অপারেটার)
  2. বরাদ্দ এবং সমতা পরীক্ষা ( :=এবং =)
  3. আছে else if, কিন্তু কোন elseনির্মাণ
  4. টারজানের শর্তসাপেক্ষ অ্যাসাইনমেন্ট অপারেটর := if
  5. টারজানের অতিরিক্ত উদাহরণ ifএবং:= if
    5.5। টারজন অ্যারে (বা তালিকা)

  6. অপারেটরদের সংক্ষিপ্তসার

  7. টারজানের ডাবল পয়েন্টেড তীর অপারেটর ( )
  8. টারজানের ডু লুপগুলি সি / জাভা-এর মতো এবং লুপগুলির মতো
  9. সমস্ত মিথ্যা শর্ত সহ টার্জনের শর্তসাপেক্ষ-অ্যাসাইনমেন্ট অপারেটর

(1) টার্জনের ইফ-অন্য ব্লক

(অপারেটর এবং |)

if-elseকনস্ট্রাক্ট সম্ভবত Tarjan এর ভাষাটি সবচেয়ে মৌলিক নিয়ন্ত্রণ স্ট্রাকচার। সি-এর মতো ইফ-ব্লকগুলি ছাড়াও, যদি-অন্যরকম আচরণ টার্জনের অ্যাসাইনমেন্ট এবং টার্জনের লুপগুলির ক্ষেত্রে প্রায় নির্মিত হয়। টার্জনের তীর অপারেটর-> (বা →) যদি ইফ-স্টেটমেন্টের শর্ত এবং যদি একটি বিবৃতি কার্যকর করে থাকে তবে তার মধ্যে একটি সীমানা থাকে।

উদাহরণস্বরূপ, টার্জনের ভাষায় আমাদের থাকতে পারে:

# Example One
if a = 4 → x := 9 fi    

যদি আমরা উপরের টারজান কোডের লাইনটি আংশিকভাবে সি বা জাভাতে অনুবাদ করি তবে আমরা নিম্নলিখিতটি পাই:

if (a = 4)
    x := 9
fi 

ডান কোঁকড়ানো ধনুর্বন্ধনী পরিবর্তে (সি এবং জাভা হিসাবে) টার্জন একটি- ifব্লকটি ALGOL- এর মতো পিছনের দিকের কী-শব্দের বানান দিয়ে শেষ করে:fi

যদি আমরা আমাদের উপরের উদাহরণটির অনুবাদ চালিয়ে যান তবে আমরা পাই:

if (a = 4) {
    x := 9
}

(২) নিয়োগ ও সমতা পরীক্ষা ( :=এবং= )

টারজান এই অপারেটরগুলিকে ALGOL থেকে নিয়ে যায় (পরে পাস্কালেও দেখা যায়)।

টারজান =সমতা পরীক্ষার জন্য ব্যবহার করে, অ্যাসাইনমেন্ট নয় (তাই এটি জাভার মতো কাজ করে ==)।

অ্যাসাইনমেন্টের জন্য, টারজন ব্যবহার করে :=যা জাওয়ার মতো কাজ করে =

সুতরাং, আমরা যদি আমাদের উদাহরণটির অনুবাদ চালিয়ে যেতে থাকি তবে আমাদের কাছে:

if (a == 4) {
    x = 9
}

|টারজানের ভাষায় একটি উল্লম্ব বার (বা "পাইপ" বা ) else ifসি বা জাভাতে কীওয়ার্ডের সমান ।
উদাহরণস্বরূপ, টার্জনের ভাষায় আমাদের থাকতে পারে:

# Example Two
if a = 4 → x := 9 |  a > 4  → y := 11 fi 

উপরের টারজন-কোডটি অনুবাদ করে:

if (a == 4) {
    x = 9
}
else if (a > 4)  {
    y = 11
}

(3) else ifশুধুমাত্র এবং কোন elseনির্মাণ

এর আগে, আমি সংক্ষিপ্তসারগুলি ifবর্ণনা না করেই - স্টেটমেন্টের মূল বিষয়গুলি আবরণ করেছি । তবে আমরা একটি ছোট বিস্তারিত আলোচনা করব না will টারজান-আইয়ান if-elseব্লকের শেষ ধারাটিতে সর্বদা একটি তীর ( ) অপারেটর থাকতে হবে । যেমন, কেবল elseটার্জনের ভাষায় নেই else ifelseটারজানের ভাষায় অন-ব্লকের নিকটতম জিনিসটি হল সবচেয়ে সঠিক পরীক্ষা-শর্ত করা true

if a = 4 → x := 9 |  a > 4  → y := 11 | true  → z := 99  fi

সি / জাভাতে, আমাদের থাকতে হবে:

if (a == 4) {
    x = 9
}

else if (a > 4)  {
    y = 11
}
else { // else if (true)
    z = 99
} 

সাধারণ বর্ণনাগুলির চেয়ে উদাহরণগুলি বোঝা সহজ। তবে, এখন আমাদের বেল্টের নীচে কিছু উদাহরণ রয়েছে, তা জেনে থাকুন যে তার্জনের যদি অন্য কোন নির্মাণের সাধারণ আনুষ্ঠানিকতা নীচে থাকে:

if condition
    → stuff to do
 | condition
    → stuff to do
 [...] 
 | condition 
    → stuff to do
fi       

চরিত্রটি |এমনif else

চরিত্রটি পরীক্ষা-শর্তকে স্টাফ-টু-ডু-থেকে আলাদা করে দেয়।

(৪) টার্জনের শর্তসাপেক্ষ অ্যাসাইনমেন্ট অপারেটর := if

টারজান ifদুটি খুব ভিন্ন উপায়ে ব্যবহার করা যেতে পারে। এখনও অবধি, আমরা কেবল টারজানিয়ান ব্যবহারের একটি বর্ণনা করেছি if। কিছুটা বিভ্রান্তিকরভাবে, টারজন এখনও ifদ্বিতীয় ধরণের- ifকনস্ট্রাক্টের জন্য স্বরলিপি / বাক্য গঠন ব্যবহার করে । যা ifব্যবহার করা হচ্ছে তা প্রসঙ্গে তৈরি। প্রসঙ্গটি বিশ্লেষণ করা দ্বিতীয় ধরণের টারজান হিসাবে করণ ifকরা খুব সহজ - একটি অ্যাসাইনমেন্ট অপারেটর দ্বারা সর্বদা পূর্ব-স্থির থাকে।

উদাহরণস্বরূপ, আমাদের নিম্নলিখিত টার্জন কোড থাকতে পারে:

# Example Three
x := if a = 4 → 9 fi 

ডিগ্রেশন শুরু করুন

কিছুক্ষণ টারজান কোড নিয়ে কাজ করার পরে, আপনি ক্রিয়াকলাপের জন্য অভ্যস্ত হয়ে যান। যদি আমরা উপরের উদাহরণে পরীক্ষার শর্তটি বন্ধনীরূপে রাখি তবে আমরা পাই:

x := if (a = 4) → 9 fi 

a = 4কোনও অ্যাসাইনমেন্ট অপারেশন নয়। a = 4মত a == 4- এটি সত্য বা মিথ্যা প্রত্যাবর্তন করে।

সমাপ্তি ডিগ্রেশন

এটি := ifএকক অপারেটরের সিনট্যাক্স হিসাবে ভাবতে সহায়তা করতে পারে , এর থেকে আলাদা :=এবং ifপ্রকৃতপক্ষে আমরা এটিকে উল্লেখ করব:= if অপারেটরটিকে "শর্তসাপেক্ষ অ্যাসাইনমেন্ট" অপারেটর হিসাবে ।

জন্য ifআমরা তালিকা (condition → action)। জন্য := ifআমরা তালিকা (condition → value)যেখানে valueTeh ডানদিকের সাইড মান আমরা বাঁদিকের প্রান্তের নির্ধারিত পারেlhs

# Tarjan Example Four
lhs := if (a = 4) → rhs fi 

সি বা জাভাতে দেখতে লাগবে:

# Example Four
if (a == 4) {
    lhs = rhs
}

টারজানিয়ান কোডে "শর্তসাপেক্ষ নিয়োগ" এর নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

# পাঁচটি উদাহরণের টার্জন ইনস্ট্যান্টেশন x: = a = 4 → 9 | a> 4 → 11 | সত্য → 99 ফাই

সি / জাভাতে, আমাদের থাকতে হবে:

// C/Java Instantiation of Example Five
if (a == 4) {
    x = 9
}
else if (a > 4)  {
    x = 11
}
else if (true) { // else
    x = 99
} 

(5) অপারেটরদের সংক্ষিপ্তসার:

এখনও অবধি, আমাদের রয়েছে:

  • :=...... অ্যাসাইনমেন্ট অপারেটর (সি / জাভা =)

  • =...... সমতা পরীক্ষা (সি / জাভা ==)

  • ...... যদি একটি আইফ-ব্লকের পরীক্ষার শর্ত এবং যদি একটি ব্লকের শৃঙ্খলার মধ্যে ডিলিমিটার

  • | ..... সি / জাভা অন্যথায় যদি

  • if ... fi ..... যদি-অন্য ব্লক

  • := if... fi ..... একটি if- অন্য ব্লকের উপর ভিত্তি করে শর্তসাপেক্ষ অ্যাসাইনমেন্ট

(5.5) টারজন তালিকা / অ্যারে:

টারজানের ভাষাতে অন্তর্নির্মিত অ্যারের মতো ধারক রয়েছে। টারজান অ্যারেগুলির বাক্য গঠনটি টার্জনের if elseবিবৃতিগুলির স্বরলিপিটির চেয়ে অনেক বেশি স্বজ্ঞাত ।

list1  := ['lion', 'witch', 'wardrobe'];
list2a := [1, 2, 3, 4, 5];
list2b := [1, 2];
list3  := ["a", "b", "c", "d"];
list4  := [ ]; # an empty array

টার্জন অ্যারে এলিমেন্টা ()স্কয়ার-বন্ধনী নয়, বন্ধনীতে অ্যাক্সেস করা হয়[]

সূচক শুরু হয় 1। সুতরাং,

list3  := ["a", "b", "c", "d"]
# list3(1) == "a" returns true
# list3(2) == "b" return true 

নীচে দেখায় যে কীভাবে 1 ম এবং 5 তম উপাদান যুক্ত একটি নতুন অ্যারে তৈরি করা যায় [1, 2, 3, 4, 5, 6, 7]

nums := [1, 2, 3, 4, 5, 6, 7]
new_arr := [nums(1), nums(5)]

সমতা অপারেটর অ্যারে জন্য সংজ্ঞায়িত করা হয়। নিম্নলিখিত কোড মুদ্রণtrue

x := false
if [1, 2] = [1, 2, 3, 4, 5] --> x := true
print(x)

কোনও অ্যারেটি ফাঁকা রয়েছে কিনা তা পরীক্ষার টারজানের উপায়টি এটি একটি খালি অ্যারের সাথে তুলনা করা

arr := [1, 2]
print(arr = [ ])
# `=` is equality test, not assignment

()অপারেটির সাথে একত্রে একাধিক সূচক সরবরাহ করে একটি উপ-অ্যারের একটি ভিউ (অনুলিপি তৈরি করতে পারে না) তৈরি করতে পারে..

list3  := ["a", "b", "c", "d"]

beg    := list3(.. 2)
# beg == ["a", "b"]
# beg(1) == "a"

end    := list3(3..)
# end == ["c", "d"]
# end(1) == "c"

mid    := list3(2..3)
# mid == ["b", "c"]
# mid(2) == "c"

# `list3(4)` is valid, but `mid(4)` is not 

()) টারজন ifও এর অতিরিক্ত উদাহরণ:= if

নীচে একটি টারজান শর্তসাপেক্ষ কার্যভারের আরও একটি উদাহরণ ( := if):

# Tarjan Example Six
a  := (false --> a | true --> b | false --> c1 + c2 |  (2 + 3 < 99) --> d)  

(true --> b)(cond --> action)সত্যিকারের শর্ত থাকা বামতম ধারা। সুতরাং, আসল অ্যাসাইনমেন্ট উদাহরণ সিক্সের একই অ্যাসাইনমেন্ট-আচরণ রয়েছেa := b

নীচে এই পর্যন্ত আমাদের টারজান কোডের সবচেয়ে জটিল উদাহরণ:

# Tarjan Example -- merge two sorted lists

list function merge (list s, t);

return if s =[] --> t
        | t = [ ] --> s
        | s != [ ] and t != [] and s(l) <= t(1) -->
            [s(1)]& merge(s[2..], t)
        | s != [ ]and t != [ ] and s(1) > r(l) -->
            [t(1)] & merge (s,t(2..))
       fi
end merge;

নীচে দুটি সাজানো তালিকার মার্জ করার জন্য টারজানের কোডটির অনুবাদ। নিম্নলিখিতটি হুবহু সি বা জাভা নয়, এটি টারজান সংস্করণের তুলনায় সি / জাভার অনেক কাছাকাছি।

list merge (list s, list t) { 

    if (s is empty) {
        return t;
    }
    else if (t is empty){
        return s;
    }
    else if  (s[1] <= t[1]) {
        return CONCATENATE([s[1]], merge(s[2...], t));
    else  { // else if (s[1] > t[1])
        return CONCATENATE ([t[1]], merge(s,t[2..]);
    }
}

নীচে টারজান-কোডের আরও একটি উদাহরণ এবং সি বা জাওয়ার মতো কিছুতে একটি অনুবাদ রয়েছে:

heap function meld (heap h1, h2);

    return if h1 = null --> h2
            | h2 = null --> h1
            | h1 not null and h2 not null --> mesh (h1, h2) 
           fi
end meld;

নীচে সি / জাভা অনুবাদ:

HeapNode meld (HeapNode h1, HeapNode h2) {

    if (h1 == null) {
       return h2;
    }   
    else if (h2 == null) {
        return h1;
    } else {
        mesh(h1, h2)
    }
} // end function

()) টার্জনের ডাবল পয়েন্টেড তীর অপারেটর (<--> )

নীচে টারজন কোডের একটি উদাহরণ দেওয়া হল:

x <--> y    

একটি ডাবল তীর ( ) অপারেটর টারজানের ভাষায় কী করে?
ঠিক আছে, টার্জনের ভাষার প্রায় সমস্ত ভেরিয়েবল পয়েন্টার। <-->একটি অদলবদল অপারেশন। নিম্নলিখিত প্রিন্টtrue

x_old := x
y_old := y
x <--> y
print(x == y_old) # prints true
print(y == x_old) # prints true

পারফর্ম করার পরে x <--> y, xঅবজেক্টটি নির্দেশ করে যা বস্তুটি yনির্দেশ করে এবং yযে বস্তুটির xদিকে নির্দেশ করে।

<-->অপারেটরটি ব্যবহার করে নীচে একটি টারজান বিবৃতি দেওয়া আছে :

x := [1, 2, 3]
y := [4, 5, 6]
x <--> y 

নীচে উপরের টারজন কোড থেকে বিকল্প সিউডোকোডে একটি অনুবাদ রয়েছে:

Pointer X     = address of array [1, 2, 3];
Pointer Y     = address of array [4, 5, 6];
Pointer X_OLD = address of whatever X points to;
X = address of whatever Y points to;
Y = address of whatever X_OLD points to; 

বিকল্পভাবে, আমরা থাকতে পারে:

void operator_double_arrow(Array** lhs, Array** rhs) {

    // swap lhs and rhs

    int** old_lhs = 0;
    old_lhs = lhs;
    *lhs = *rhs;
    *rhs = *old_lhs;
    return;
}

int main() {

    Array* lhs = new Array<int>(1, 2, 3);
    Array* rhs = new Array<int>(4, 5, 6);
    operator_double_arrow(&lhs, &rhs);
    delete lhs;
    delete rhs;
    return 0;
} 

নীচে অপারেটরটি ব্যবহার করে টারজানের একটি ফাংশনের উদাহরণ দেওয়া আছে :

heap function mesh (heap nodes h1, h2);
    if key(h1) > key(h2) → h1 ⟷  h2 fi;
    right (h1) := if right(h1) = null → h2
                   |right(h1) ≠ null → mesh (right(h1), h2)
                  fi;

    if rank (left (h1)) < rank (right (h1))
        → left(h1) ⟷ right(h1)
    fi;

    rank (h1) := rank(right(h1)) + 1;
    return h1;
end mesh;

নীচে টারজানের meshফাংশনটির সিউডো কোডে অনুবাদ করা হয়েছে যা সি নয়, তবে দেখতে সি এর তুলনায় আরও বেশি (তুলনামূলকভাবে কথা বলা)। এর উদ্দেশ্য টারজানের অপারেটর কীভাবে কাজ করে তা বোঝানো ।

node pointer function mesh(node pointers h1, h2) {

    if (h1.key) > h2.key) {

         // swap h1 and h2
            node pointer temp;
            temp = h1;
            h1 = h2;
            h2 = temp;
    }

    // Now, h2.key <= h1.key   

    if (h1.right == null) {
        h1.right = h2;

    } else // h1.key != null {
        h1.right = mesh(h1.right, h2);
    }



    if (h1.left.rank < h1.right.rank ) {
        // swap h1.left and h1.right

        node pointer temp;
        temp = h1;
        h1 = h2;
        h2 = temp;
    }

    h1.rank = h1.right.rank + 1;
    return h1;
}    

(8) টারজানের ডু লুপগুলি সি / জাভা-এর মতো এবং লুপগুলির মতো

টার্জনের ভাষা ifএবং নির্মাণগুলি forসি / জাভা প্রোগ্রামারদের জন্য পরিচিত। তবে কিছুক্ষণের জন্য টারজন কীওয়ার্ডটি হ'ল do। সমস্ত- doলুপগুলি কীওয়ার্ডের সাথে শেষ হয় odযা এর পিছনের দিকের বানান do। নীচে একটি উদাহরণ দেওয়া হল:

sum := 0
do  sum < 50 → sum := sum + 1 

সি-স্টাইলের সিউডোকোডে, আমাদের রয়েছে:

sum = 0;
while(sum < 50) {
    sum = sum + 1;
}

উপরেরটি আসলে বেশ সঠিক নয়। একটি টারজান ডু-লুপটি সত্যিকার অর্থে সি / জাভা while(true)হয় যদি ভিতরে অন্য ভিতরে বাধা থাকে block টারজান কোডের আরও আক্ষরিক অনুবাদ নীচে রয়েছে:

sum = 0;
while(true) {
    if (sum < 50) {
         sum = sum + 1;
         continue;
         // This `continue` statement is questionable
    }
    break;
}

নীচে, আমাদের আরও জটিল doটার্জন-লুপ রয়েছে:

sum := 0
do  sum < 50 → sum := sum + 1 | sum < 99 → sum := sum + 5

জটিল doটারজন-লুপের জন্য সি / জাভা-স্টাইলের সিউডোকোডটি নিম্নরূপ:

sum = 0;
while(true) {

    if (sum < 50) {
         sum = sum + 1;
         continue;
    }
    else if (sum < 99) {
         sum = sum + 5;
         continue;
    }
    break;
}

(9) সমস্ত মিথ্যা শর্ত সহ টার্জনের শর্তসাপেক্ষ-অ্যাসাইনমেন্ট অপারেটর

যদিও উপরের দীর্ঘ বিবরণটি বেশিরভাগ জিনিসকে কভার করে, কয়েকটি বিষয় এখনও অমীমাংসিত থেকে যায়। আমি আশা করি যে কেউ অন্য দিন আমার উপর ভিত্তি করে একটি নতুন উন্নত উত্তর লিখবে যা এই প্রশ্নগুলির উত্তর দেয়।

উল্লেখযোগ্যভাবে, যখন শর্তসাপেক্ষ অ্যাসাইনমেন্ট অপারেটর := ifব্যবহার করা হয় এবং কোনও শর্ত সত্য হয় না তখন আমি ভেরিয়েবলের জন্য নির্ধারিত মানটি না not

x  := if (False --> 1| False --> 2 | (99 < 2) --> 3) fi

আমি নিশ্চিত নই, তবে এটি সম্ভবত সম্ভব যে কোনও কাজ করা হয়নি x:

x = 0;
if (false) {
     x = 1;
}
else if (false) {
     x = 2;
}
else if (99 < 2) {
     x = 3;
}
// At this point (x == 0)

আপনার প্রয়োজন হতে পারে যে বাম-পাশের ভেরিয়েবলটি একটি তে দেখা উচিত := if বিবৃতিতে আগে ঘোষণা করা উচিত। সেক্ষেত্রে সমস্ত শর্তটি মিথ্যা হলেও ভেরিয়েবলের এখনও একটি মান থাকবে।

বিকল্পভাবে, সম্ভবত সমস্ত-মিথ্যা শর্তগুলি রানটাইম ত্রুটির প্রতিনিধিত্ব করে। আরেকটি বিকল্প হ'ল একটি বিশেষ nullমান ফেরত দেওয়া , এবং nullঅ্যাসাইনমেন্টের বাম-হাতের যুক্তিতে সংরক্ষণ করা।


7
আমি মনে করি কেবল কোনও দোভাষী / অনুবাদক বাস্তবায়ন এবং / অথবা একটি অপারেশনাল শব্দার্থ রচনার বিষয়টি আপনার সাথে সময় কাটানোর জন্য আরও মূল্যবান উপায় হতে পারে।
ডেরেক এলকিনস

2
এটি লক্ষণীয় যে এগুলির কয়েকটি বৈশিষ্ট্য অন্যের চেয়ে বেশি "বহিরাগত"। উদাহরণস্বরূপ, সম্ভবত অনেকগুলি ভাষা রয়েছে যেখানে =তুলনা করার অর্থ এটির কার্যকারিতা যেখানে বোঝায় (যদি আমি কোনও ভাষা লিখি তবে আমি এটিকে একটি বাক্য গঠন ত্রুটি করে ফেলতাম, এবং ঠিক আছে :=এবং ==)। অন্যদিকে, অদলবদল অপারেটরটি এমন এক ধরণের জিনিস যা কেবল বিশেষ ভাষায় দেখা যায় যেখানে এটি একটি সাধারণ অপারেশন ছিল; অন্য ভাষায়, যদিও আপনি কেবল একটি লাইব্রেরি ফাংশন ধরে নিতে পারেন swapএবং প্রতিবার প্রয়োগটি লেখার চেয়ে প্রতিস্থাপন h1 ⟷ h2করতে পারেন swap(h1, h2)
আইএমএসওপি

2
[1, 2] = [1, 2, 3, 4, 5]সত্য কেন ?
এরহানিস

3
|অপারেটর একটি হল পাহারা । এগুলি ফ্যাসিক সংজ্ঞাগুলিতে হাস্কেল (এবং আমি বিশ্বাস করি অন্যান্য কার্যকরী ভাষায়) ব্যবহৃত হয়: f x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)এখানে otherwiseএকটি উপাধি রয়েছে Trueএবং fফাইবোনাকির সংখ্যা সংজ্ঞায়িত করে।
বাকুরিউ

2
@ ডেরেকএলকিন্স প্রাকৃতিক ভাষায় নিজের বোধগম্যতা কেবল লেখার তুলনায় (অন্যান্য মানুষ বোঝার জন্য পর্যাপ্ত বিশদ পর্যন্ত), আপনার উল্লেখ করা উভয় ক্রিয়াকলাপ আমি যতটা বলতে পারি ততই যথেষ্ট সময় নিতে পারে। এটি পরিষ্কার নয় যে এটি সময়ের আরও মূল্যবান ব্যবহার হবে (বিশেষত যদি লক্ষ্যটির সন্ধান করা হচ্ছে প্রাথমিকভাবে বোঝা )।
শ্রীভাতসারআর

7

এটি আগে কখনও দেখেনি তবে আমি মনে করি প্রসঙ্গে যেটি বোঝানো হয়েছে তা আমি অনুমান করতে পারি .. সম্ভবত এটি অবশ্যই একটি সোয়াপ অপারেশন হতে হবে এবং if G1 -> S1 | G2 - >S2 | ... fiএটি ?:সি / জাভাতে টার্নারি অপারেটরের মতো একটি মান / আবার / অন্যথায় টাইপ করা কনস্ট্রাক্ট is

এটি হাতে রেখে আমরা উপরের ফাংশনটি জাভা-জাতীয় ভাষায় লিখতে পারি:

HeapNode mesh(HeapNode h1, HeapNode h2)
{
  if(h1.key > h2.key)
  {
    // swap h1 and h2

    HeapNode t = h1;
    h1 = h2;
    h2 = t;
  }

  // One of the two cases has to hold in this case so we won't get to the
  // exception, but it'd be an exception if none of the cases were satisified
  // since this needs to return *something*.

  h1.right = (h1.right == null) ? h2 
             : (h1.right != null) ? mesh(h1.right, h2) 
             : throw new Exception();

  if(h1.left.rank < h1.right.rank)
  {
    // swap h1.left and h1.right

    HeapNode t = h1.left;
    h1.left = h1.right;
    h1.right = t;
  }

  h1.rank = h1.right.rank + 1;

  return h1;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.