আপনি যদি কেবল এটি কয়বার হ্রাস পেয়েছে এবং নির্দিষ্টভাবে পুনরাবৃত্তির বিষয়ে যত্নশীল না হন তা গণনা করার চেষ্টা করছেন ... আপনি কেবল পুনরাবৃত্তি সরাতে পারেন। নীচের কোডটি মূল পোস্টের প্রতি বিশ্বস্ত থাকে কারণ এটি num <= 9হ্রাসের প্রয়োজন হিসাবে গণনা করা হয় না । অতএব, singleDigit(8)থাকবে count = 0, এবং singleDigit(39)থাকবে count = 3, শুধু ওপি এবং গ্রহণযোগ্য উত্তর প্রদর্শক মত:
const singleDigit = (num) => {
let count = 0, ret, x;
while (num > 9) {
ret = 1;
while (num > 9) {
x = num % 10;
num = (num - x) / 10;
ret *= x;
}
num *= ret;
count++;
console.log(num);
}
console.log("Answer = " + num + ", count = " + count);
return num;
}
9 বা তারও কম সংখ্যক প্রক্রিয়া করা (যেমন। num <= 9) অপ্রয়োজনীয় । দুর্ভাগ্যক্রমে ওপি কোডটি num <= 9এটি গণনা করে না এমনকী প্রক্রিয়া করবে। উপরের কোডটি মোটেও প্রক্রিয়া করবে না বা গণনা করবে না num <= 9। এটি কেবল এটি মাধ্যমে পাস।
আমি ব্যবহার না করা বেছে নিই .reduceকারণ প্রকৃত গণিতটি সম্পাদন করা খুব দ্রুত ছিল। এবং, আমার জন্য, বুঝতে সহজ।
গতিতে আরও চিন্তা
আমার মনে হচ্ছে ভাল কোডও দ্রুত। আপনি যদি এই ধরণের হ্রাস ব্যবহার করেন (যা সংখ্যার ক্ষেত্রে প্রচুর পরিমাণে ব্যবহৃত হয়) আপনার এটিকে বিপুল পরিমাণে ডেটা ব্যবহার করার প্রয়োজন হতে পারে। এই ক্ষেত্রে, গতি গুরুত্বের সর্বোচ্চ হয়ে উঠবে।
উভয় .map(Number)এবং console.log(প্রতিটি হ্রাস পদক্ষেপে) উভয়ই কার্যকর করা খুব দীর্ঘ এবং অপ্রয়োজনীয়। কেবল .map(Number)ওপি থেকে মুছে ফেলা প্রায় 4.38x এর গতি বাড়িয়ে তোলে। মুছে ফেলা console.logএতো তাড়াতাড়ি সঠিকভাবে পরীক্ষা করা প্রায় অসম্ভব (আমি এটির জন্য অপেক্ষা করতে চাইনি)।
সুতরাং, কাস্টমকম্যান্ডারের উত্তরের অনুরূপ , ব্যবহার .map(Number)না করে console.logএবং ফলাফলগুলিকে অ্যারে তে ঠেকানো এবং এর .lengthজন্য ব্যবহার countকরা অনেক দ্রুত। দুর্ভাগ্যবশত জন্য customcommander এর উত্তর, একটি ব্যবহার উত্পাদক ফাংশন সত্যিই সত্যিই ধীর (যে উত্তর 2.68x সম্পর্কে ছাড়া ওপি তুলনায় ধীর হয় .map(Number)এবং console.log)
এছাড়াও, ব্যবহার করার পরিবর্তে .reduceআমি কেবল আসল গণিত ব্যবহার করেছি। এই একক পরিবর্তনটি 3.59x এর একটি ফ্যাক্টর দ্বারা আমার ফাংশনটির সংস্করণ বাড়িয়েছে।
অবশেষে, পুনরাবৃত্তিটি ধীর হয়, এটি স্ট্যাকের জায়গা নেয়, আরও মেমরি ব্যবহার করে এবং এটি কতবার "পুনরাবৃত্তি" করতে পারে তার সীমাবদ্ধতা রয়েছে। বা, এক্ষেত্রে, হ্রাসের কতগুলি পদক্ষেপ এটি সম্পূর্ণ হ্রাস শেষ করতে ব্যবহার করতে পারে। আপনার পুনরাবৃত্তিকে পুনরাবৃত্তকারী লুপগুলিতে আবর্তিত করা সমস্ত কিছু স্ট্যাকের একই স্থানে রাখে এবং এটি শেষ করতে কতগুলি হ্রাস পদক্ষেপ ব্যবহার করতে পারে তার কোনও তাত্ত্বিক সীমা নেই। সুতরাং, এখানে এই ফাংশনগুলি প্রায় কোনও আকারের পূর্ণসংখ্যাকে "হ্রাস" করতে পারে, কেবলমাত্র মৃত্যুদন্ড কার্যকর করার সময় এবং একটি অ্যারে কত দীর্ঘ হতে পারে তা দ্বারা সীমাবদ্ধ।
এই সব মনে ...
const singleDigit2 = (num) => {
let red, x, arr = [];
do {
red = 1;
while (num > 9) {
x = num % 10;
num = (num - x) / 10;
red *= x;
}
num *= red;
arr.push(num);
} while (num > 9);
return arr;
}
let ans = singleDigit2(39);
console.log("singleDigit2(39) = [" + ans + "], count = " + ans.length );
// Output: singleDigit2(39) = [27,14,4], count = 3
উপরের ফাংশনটি অত্যন্ত দ্রুত চলে। এটা খুলছেনা চেয়ে (ছাড়া দ্রুত 3.13x সম্পর্কে .map(Number)এবং console.logযতো তাড়াতাড়ি) এবং 8.4x সম্পর্কে customcommander এর উত্তর। মনে রাখবেন যে console.logওপি থেকে মুছে ফেলা এটিকে হ্রাসের প্রতিটি পদক্ষেপে একটি সংখ্যা উত্পাদন করতে বাধা দেয়। অতএব, প্রয়োজন এখানে অ্যারে এই ফলাফলগুলি ধাক্কা।
পিটি
.map(Number)অপ্রয়োজনীয় যেহেতু*অপারেটর যেভাবেই মানগুলিতে সংখ্যায় জোর করে। ;-)