যেহেতু এখানে বেশ কয়েকটি সমাধান রয়েছে আমি আপনার প্রশ্নের "সমালোচনা" অংশ নিয়ে যাচ্ছি। কয়েকটি নোট: আমি কিছু টাইপস স্থির করেছি এবং আমি কোথায় করেছি তা উল্লেখ করেছি। আমি যদি তাদের সম্পর্কে টাইপো হওয়া সম্পর্কে ভুল হয়ে থাকি তবে তা মন্তব্যে উল্লেখ করুন এবং আমি কী ঘটছে তা ব্যাখ্যা করব। আমি বেশ কয়েকটি বিষয় উল্লেখ করতে যাচ্ছি যা আপনি ইতিমধ্যে জেনে থাকতে পারেন, তাই দয়া করে আমি যদি তা না করি তবে অপরাধ করবেন না। কিছু মন্তব্য পিক মনে হতে পারে তবে আমি জানি না আপনি কোথায় যাত্রা করছেন তাই ধরে নিতে হবে আপনি সবে শুরু করছেন।
CREATE function Palindrome (
@String Char
, @StringLength Int
, @n Int
, @Palindrome BIN
, @StringLeftLength Int
সর্বদা একটি সংজ্ঞা charবা varcharসংজ্ঞা সহ দৈর্ঘ্য অন্তর্ভুক্ত করে । অ্যারন বারট্র্যান্ড এখানে গভীরতার সাথে আলোচনা করে । তিনি কথা বলছেন varcharকিন্তু একই জন্য যায় char। varchar(255)আপনি যদি কেবল তুলনামূলকভাবে ছোট স্ট্রিং চান বা একটি varchar(8000)বৃহত্তর বা এমনকি একটির জন্য চান তবে আমি এটির জন্য একটি ব্যবহার করব varchar(max)। Varcharপরিবর্তনশীল দৈর্ঘ্যের স্ট্রিং charকেবল স্থিরদের জন্য for যেহেতু আপনি নিশ্চিত নন যে স্ট্রিংয়ের দৈর্ঘ্যটি ব্যবহারের মধ্যে দিয়ে যাচ্ছে varchar। এছাড়াও এটি binaryনা bin।
পরবর্তী আপনাকে পরামিতি হিসাবে vari সমস্ত পরিবর্তনশীল রাখার দরকার নেই। এগুলি আপনার কোডের মধ্যে ঘোষণা করুন। প্যারামিটার তালিকায় কেবল কোনও কিছু রাখুন যদি আপনি এটি পাস বা বাইরে পাস করার পরিকল্পনা করেন। (আপনি দেখতে পাবেন কিভাবে এটি শেষের দিকে দেখায়)) এছাড়াও আপনার কাছে @ স্ট্রিং লেফট লেংথ রয়েছে তবে এটি কখনই ব্যবহার করবেন না। সুতরাং আমি এটি ঘোষণা করতে যাচ্ছি না।
পরবর্তী কাজটি আমি যা করতে যাচ্ছি তা হ'ল কিছু বিষয় পরিষ্কার করার জন্য কিছুটা পুনরায় ফর্ম্যাট করা।
BEGIN
SET @n=1
SET @StringLength = Len(@String) -- Missed an @
WHILE @StringLength - @n >1
IF Left(@String,@n)=Right(@String, @StringLength) -- More missing @s
SET @n = @n + 1 -- Another missing @
SET @StringLength = @StringLength - 1 -- Watch those @s :)
RETURN @Palindrome = 1 -- Assuming another typo here
ELSE
RETURN @Palindrome =0
END
আমি যেভাবে ইনডেন্টিং করেছি সেদিকে নজর দিলে আপনি দেখতে পাবেন যে আমার কাছে এটি রয়েছে:
WHILE @StringLength - @n >1
IF Left(@String,@n)=Right(@String, @StringLength)
SET @n = @n + 1
এটি কারণ কমান্ড পছন্দ WHILEIF তাদের পরে কোডের প্রথম লাইনটিকে এবং প্রভাবিত করে। আপনি BEGIN .. ENDএকাধিক কমান্ড চাইলে আপনাকে একটি ব্লক ব্যবহার করতে হবে । সুতরাং আমরা ঠিক করেছি যে স্থির:
WHILE @StringLength - @n > 1
IF Left(@String,@n)=Right(@String, @StringLength)
BEGIN
SET @n = @n + 1
SET @StringLength = @StringLength - 1
RETURN @Palindrome = 1
END
ELSE
RETURN @Palindrome = 0
আপনি লক্ষ্য করবেন যে আমি কেবল একটি যুক্ত করেছি BEGIN .. END ব্লকIF । কারণ কারণ যদিও IFবিবৃতিটি একাধিক লাইন দীর্ঘ (এবং এমনকি একাধিক কমান্ড রয়েছে) এটি এখনও একটি একক বিবৃতি (সমস্ত কিছুতে IFএবংELSE অংশগুলির করে)।
এর পরে আপনি আপনার উভয়ের পরে একটি ত্রুটি পাবেন RETURNs । আপনি একটি চলক বা একটি আক্ষরিক ফিরে আসতে পারেন। আপনি ভেরিয়েবল সেট করতে এবং একই সাথে এটি ফিরিয়ে দিতে পারবেন না।
SET @Palindrome = 1
END
ELSE
SET @Palindrome = 0
RETURN @Palindrome
এখন আমরা যুক্তিযুক্ত। প্রথমে আমাকে উল্লেখ করতে দিন যেLEFTRIGHT আপনি এবং ফাংশনগুলি ব্যবহার করছেন তা দুর্দান্ত, তবে তারা আপনাকে অনুরোধ করা দিক থেকে আপনি যে পরিমাণ অক্ষরের পাশ দিয়ে চলেছেন তা দিতে চলেছে। সুতরাং যাক আপনি "পরীক্ষা" শব্দটিতে পাস করেছেন। প্রথম পাসে আপনি এটি পেতে চলেছেন (ভেরিয়েবল অপসারণ):
LEFT('test',1) = RIGHT('test',4)
t = test
LEFT('test',2) = RIGHT('test',3)
te = est
স্পষ্টতই এটি আপনি প্রত্যাশা করেননি। আপনি সত্যিই ব্যবহার করতে চানsubstringপরিবর্তে । সাবস্ট্রিং আপনাকে কেবল প্রারম্ভিক বিন্দুতে নয় দৈর্ঘ্যেও যেতে দেয়। সুতরাং আপনি পাবেন:
SUBSTRING('test',1,1) = SUBSTRING('test',4,1)
t = t
SUBSTRING('test',2,1) = SUBSTRING('test',3,1)
e = s
এরপরে আপনি আপনার লুপে কেবলমাত্র আইএফ স্টেটমেন্টের একটি শর্তে ব্যবহার করেন এমন ভেরিয়েবলগুলি বাড়িয়ে দিচ্ছেন। ভেরিয়েবল ইনক্রিমেন্টিং পুরোপুরি সেই কাঠামোর বাইরে টানুন। এটি একটি অতিরিক্ত প্রয়োজন হতে যাচ্ছেBEGIN .. END ব্লক প্রয়োজন, কিন্তু আমি অন্য একটি অপসারণ করতে হবে।
WHILE @StringLength - @n > 1
BEGIN
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
SET @Palindrome = 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
আপনার আপনার পরিবর্তন করা প্রয়োজন WHILEশেষ পরীক্ষার জন্য আপনাকে অবস্থার ।
WHILE @StringLength > @n
এবং সর্বশেষে তবে সর্বনিম্ন নয়, এখন এটি যেভাবে দাঁড়িয়েছে আমরা যদি শেষের অক্ষরটি পরীক্ষা করি না তবে যদি সেখানে একটি বিচিত্র সংখ্যক চরিত্র থাকে। উদাহরণস্বরূপ 'আনা' দিয়েn পরীক্ষা করা হয়নি। এটি ঠিক আছে তবে এটি আমার কী দরকার যে আমাদের একটি একক অক্ষরের শব্দের জন্য অ্যাকাউন্ট করতে হবে (যদি আপনি এটি ইতিবাচক হিসাবে গণনা করতে চান)। সুতরাং আমরা সামনে ভ্যালু সেট আপ করতে পারেন।
এবং এখন আমাদের শেষ পর্যন্ত:
CREATE FUNCTION Palindrome (@String varchar(255))
RETURNS Binary
AS
BEGIN
DECLARE @StringLength Int
, @n Int
, @Palindrome binary
SET @n = 1
SET @StringLength = Len(@String)
SET @Palindrome = 1
WHILE @StringLength > @n
BEGIN
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
SET @Palindrome = 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
RETURN @Palindrome
END
একটি শেষ মন্তব্য। আমি সাধারণভাবে ফর্ম্যাট করার একটি বড় অনুরাগী। আপনার কোডটি কীভাবে কাজ করে তা দেখতে এটি আপনাকে সত্যই সহায়তা করতে পারে এবং সম্ভাব্য ভুলগুলি চিহ্নিত করতে সহায়তা করে।
সম্পাদন করা
স্পিনএক্সএক্সএক্সএক্স যেমন উল্লেখ করেছে যে আমাদের যুক্তিতে এখনও ত্রুটি রয়েছে। একবার আমরা আঘাত করে 0 তে ELSEসেট @Palindromeকরে চলার কোনও মানে হয় না। আসলে সেই মুহুর্তে আমরা ঠিক করতে পারি RETURN।
IF SUBSTRING(@String,@n,1) = SUBSTRING(@String, @StringLength,1)
SET @Palindrome = 1
ELSE
RETURN 0
প্রদত্ত যে আমরা এখন কেবল @Palindrome"এটি এখনও সম্ভব এটি একটি প্যালিনড্রোম" এর জন্য ব্যবহার করছি এটি হওয়ার কোনও সত্যিকার অর্থেই এর অর্থ নেই। আমরা ভেরিয়েবল থেকে মুক্তি পেতে পারি এবং ব্যর্থতার (শ ) এবং (একটি ইতিবাচক প্রতিক্রিয়া) শর্ট সার্কিটের সাথে আমাদের যুক্তিটি তখনই লুপটির মাধ্যমে তৈরি করতে পারি। আপনি লক্ষ্য করবেন এটি আসলে আমাদের যুক্তি কিছুটা সহজ করে দেয়।RETURN 0RETURN 1
CREATE FUNCTION Palindrome (@String varchar(255))
RETURNS Binary
AS
BEGIN
DECLARE @StringLength Int
, @n Int
SET @n = 1
SET @StringLength = Len(@String)
WHILE @StringLength > @n
BEGIN
IF SUBSTRING(@String,@n,1) <> SUBSTRING(@String, @StringLength,1)
RETURN 0
SET @n = @n + 1
SET @StringLength = @StringLength - 1
END
RETURN 1
END
LTRIM(RTRIM(...))হোয়াইটস্পেস?