প্রথম অদলবদল ফাংশন কি ভুল?

আমি একটি অ্যারের উপাদানগুলির ক্রমাঙ্কন উৎপন্ন করার জন্য একটি কোড লিখছি। আমি অস্থায়ী স্টোরেজ ব্যবহার করে দুটি ভিন্ন ধরনের অদলবদল ফাংশন লিখেছি এবং অন্য যে কোনও অস্থায়ী স্টোরেজ ব্যবহার করে না সেটি আউটপুট তৈরি করা হয় না। কেন এই ঘটছে ??

নিম্নলিখিত কোড জরিমানা কাজ করে

#include
#include
using namespace std;
int tt=0;
void swap1 (int v[], int i, int j) {
    int t;

    t = v[i];
    v[i] = v[j];
    v[j] = t;
}   
void permute(int arr[],int n,int index)
{
     if(index==n)
                {
                for(int i=0;i< n ;j++)
         {
           swap1(arr,index,j);
           permute(arr,n,index+1); 
           swap1(arr,j,index);           
         }        
}
int main()
{
    int arr[]={'a','b','c','d'};
    permute(arr,4,0);
    cout<

নিম্নলিখিত কোড ক্রমাঙ্কন আউটপুট না যখন:

#include
#include
using namespace std;
int tt=0;
void swap(int v[],int i,int j)
{
     v[i]= v[i] + v[j];
     v[j]= v[i] - v[j];
     v[i]= v[i] - v[j];
}
void permute(int arr[],int n,int index)
{
     if(index==n)
                {
                for(int i=0;i< n ;j++)
         {
           swap(arr,index,j);
           permute(arr,n,index+1); 
           swap(arr,j,index);           
         }        
}
int main()
{
    int arr[]={'a','b','c','d'};
    permute(arr,4,0);
    cout<
0
মনে রাখবেন যে std :: swap() বিদ্যমান এবং সম্ভব হলে ব্যবহার করা উচিত, কিন্তু আপনার swap() ফাংশনটির নাম-সংঘর্ষ হতে পারে কারণ আপনি ব্যবহার করছেন নামস্থান std;
যোগ লেখক stefaanv, উৎস

2 উত্তর

দয়া করে, আপনি যে দেবতার (বা অন্যথায়) বিশ্বাস করেন তার ভালোবাসার জন্য, আপনার দ্বিতীয় সোয়াপ ফাংশন (বা ভয়ঙ্কর XOR-swap কৌতুক) মত কুশ্রী হ্যাক ব্যবহার করবেন না।

তারা সম্পূর্ণ অপ্রয়োজনীয় এবং সাধারণত ধীর একটি সাধারণ অস্থায়ী ভেরিয়েবলের সমাধান ছাড়া। তারা আপনার কোডগুলি যেমন দৈনিক ডাব্লুটিএফ , এবং প্রজন্মের প্রজন্মের (যাদের আছে যেমন নির্দোষ বজায় রাখা) এগিয়ে শতাব্দী মাধ্যমে আপনার নাম অভিশাপ হবে :-)

এবং, যে কোনও ক্ষেত্রেই, যদি আপনি "অদলবদল" উভয় উপাদান একই হয় তবে তারা কাজ করবে না, কারণ তাত্ক্ষণিকভাবে আপনি করবেন:

v[i]= v[i] + v[j];

যেখানে i এবং j একই মান, আপনি কাজ করার জন্য অন্যান্য পদক্ষেপগুলির জন্য প্রয়োজনীয় তথ্য হারিয়ে ফেলেছেন।

আপনি এই কর্মে নিম্নলিখিত হিসাবে দেখতে পারেন। চলুন শুরু করা যাক আপনার দুটি আলাদা ভেরিয়েবল, a = 20 এবং b = 30 । আপনার পদক্ষেপগুলির মাধ্যমে কাজ করুন:

a = a + b; //a <- (20 + 30) = 50, b still = 30.
b = a - b; //b <- (50 - 30) = 20, a still = 50.
a = a - b; //a <- (50 - 20) = 30, b still = 20.

এবং তারা অদলবদল, যদিও আপনি সম্ভবত ওভারফ্লো এবং এনকোডিং স্কিমগুলির সাথে প্রান্তের ক্ষেত্রে অনুসন্ধান করতে চান, যেগুলি দুইটি সম্পূরক নয় (C এ যাই হোক না কেন, C ++- কে 'সম্পূর্ন বা সাইন-ম্যামোগ্রাফি) অনুমতি দেয় কিনা।

কিন্তু আসুন দেখি যে যখন a এবং b উভয়ই একই ভেরিয়েবল (একই মান নয় বরং প্রকৃত) একই পরিবর্তনশীল, একটি রেফারেন্স মত)। তাই তারা "উভয়" এর মূল্য আছে 20 এবং আপনি তাদের এখনও একটি swap পরে 20 হতে উভয় হতে আশা করবে কিন্তু এর একটি চেহারা আছে:

a = a + b; //a <- (20 + 20) = 40, AND b = 40 as well.
b = a - b; //b <- (40 - 40) =  0, AND a =  0 as well.
a = a - b; //a <- ( 0 -  0) =  0, AND b =  0 as well.

যে না সত্যিই আপনি প্রত্যাশিত ফলাফল।

0
যোগ
@ পক্সদিবলো এই পরামর্শের জন্য ধন্যবাদ ....
যোগ লেখক manyu, উৎস
+1 8-বিট মাইক্রোপ্রসেসরগুলিতে অ্যাসেম্বিং ভাষা ব্যবহার থেকে দূরে সরানো থেকে যেহেতু কোনও উপকার পাওয়া যায় না এমন হিংস্র হ্যাক ব্যবহার করার জন্য লোকেদের +1 করার জন্য ...
যোগ লেখক Axel, উৎস
উপরন্তু, অ্যারের বিষয়বস্তু উপর নির্ভর করে, একটি ওভারফ্লো/অধীন কম্পোনেশন সময় ঘটতে পারে।
যোগ লেখক swegi, উৎস
void swap(int v[],int i,int j)
{
     v[i]= v[i] + v[j];
     v[j]= v[i] - v[j];
     v[i]= v[i] - v[j];
}

যখন i == j (এটি তারপর v [i] সেট করে 0), আপনার লুপের সাথে যা ঘটে

for (int j = index; j < n; ++j) {
    swap(arr, index, j);
0
যোগ
শুধু আমার মন ক্লিক না .... ধন্যবাদ অনেক সময় আপনি আমাকে অনেক সময় সংরক্ষিত। :)
যোগ লেখক manyu, উৎস