تخطَّ إلى المحتوى

الخوارزميات

أمثلة على تنفيذ خوارزميات شائعة في لغة كنوز.

دالة ترتيب_فقاعة(متغير أعداد: [صحيح; 10]) {
دع ن = 10;
لكل ت في 0..ن {
لكل ج في 0..(ن - ت - 1) {
إذا أعداد[ج] > أعداد[ج + 1] {
// تبديل
دع مؤقت = أعداد[ج];
أعداد[ج] = أعداد[ج + 1];
أعداد[ج + 1] = مؤقت;
}
}
}
}
// الاستخدام
دع متغير بيانات = [64, 34, 25, 12, 22, 11, 90, 45, 33, 77];
ترتيب_فقاعة(بيانات);
// طباعة النتيجة
لكل ع في بيانات {
اطبع_صحيح(ع);
}

ترتيب الاختيار (Selection Sort)

Section titled “ترتيب الاختيار (Selection Sort)”
دالة ترتيب_اختيار(متغير أعداد: [صحيح; 10]) {
دع ن = 10;
لكل ت في 0..(ن - 1) {
دع متغير فهرس_الأدنى = ت;
لكل ج في (ت + 1)..ن {
إذا أعداد[ج] < أعداد[فهرس_الأدنى] {
فهرس_الأدنى = ج;
}
}
// تبديل
دع مؤقت = أعداد[ت];
أعداد[ت] = أعداد[فهرس_الأدنى];
أعداد[فهرس_الأدنى] = مؤقت;
}
}

ترتيب الإدراج (Insertion Sort)

Section titled “ترتيب الإدراج (Insertion Sort)”
دالة ترتيب_إدراج(متغير أعداد: [صحيح; 10]) {
دع ن = 10;
لكل ت في 1..ن {
دع مفتاح = أعداد[ت];
دع متغير ج = ت - 1;
طالما ج >= 0 و أعداد[ج] > مفتاح {
أعداد[ج + 1] = أعداد[ج];
ج -= 1;
}
أعداد[ج + 1] = مفتاح;
}
}
دالة بحث_خطي(أعداد: [صحيح; 10], هدف: صحيح) -> اختياري<صحيح> {
لكل ت في 0..10 {
إذا أعداد[ت] == هدف {
أرجع بعض(ت);
}
}
أرجع عدم;
}
// الاستخدام
دع بيانات = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
طابق بحث_خطي(بيانات, 50) {
بعض(فهرس) => {
اطبع("وُجد في الفهرس:");
اطبع_صحيح(فهرس);
}
عدم => {
اطبع("غير موجود");
}
}
دالة بحث_ثنائي(أعداد: [صحيح; 10], هدف: صحيح) -> اختياري<صحيح> {
دع متغير يسار = 0;
دع متغير يمين = 9;
طالما يسار <= يمين {
دع وسط = (يسار + يمين) / 2;
إذا أعداد[وسط] == هدف {
أرجع بعض(وسط);
} وإلا إذا أعداد[وسط] < هدف {
يسار = وسط + 1;
} وإلا {
يمين = وسط - 1;
}
}
أرجع عدم;
}
// الاستخدام (يجب أن تكون المصفوفة مرتبة)
دع بيانات_مرتبة = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
طابق بحث_ثنائي(بيانات_مرتبة, 70) {
بعض(فهرس) => {
اطبع("وُجد في الفهرس:");
اطبع_صحيح(فهرس); // 6
}
عدم => {
اطبع("غير موجود");
}
}
// التكرارية
دالة فيبوناتشي_تكراري(ن: ص64) -> ص64 {
إذا ن <= 1 {
أرجع ن;
}
دع متغير أ: ص64 = 0;
دع متغير ب: ص64 = 1;
لكل ت في 2..=ن {
دع مؤقت = أ + ب;
أ = ب;
ب = مؤقت;
}
أرجع ب;
}
// العودية
دالة فيبوناتشي_عودي(ن: صحيح) -> صحيح {
إذا ن <= 1 {
أرجع ن;
}
أرجع فيبوناتشي_عودي(ن - 1) + فيبوناتشي_عودي(ن - 2);
}
// الاستخدام
لكل ت في 0..10 {
اطبع_صحيح(فيبوناتشي_تكراري(ت));
}
// التكرارية
دالة ضربي_تكراري(ن: ص64) -> ص64 {
دع متغير نتيجة: ص64 = 1;
لكل ت في 2..=ن {
نتيجة *= ت;
}
أرجع نتيجة;
}
// العودية
دالة ضربي_عودي(ن: ص64) -> ص64 {
إذا ن <= 1 {
أرجع 1;
}
أرجع ن * ضربي_عودي(ن - 1);
}
// الاستخدام
اطبع_صحيح(ضربي_تكراري(10)); // 3628800

القاسم المشترك الأكبر (GCD)

Section titled “القاسم المشترك الأكبر (GCD)”
دالة قاسم_مشترك_أكبر(أ: صحيح, ب: صحيح) -> صحيح {
إذا ب == 0 {
أرجع أ;
}
أرجع قاسم_مشترك_أكبر(ب, أ % ب);
}
// المضاعف المشترك الأصغر
دالة مضاعف_مشترك_أصغر(أ: صحيح, ب: صحيح) -> صحيح {
أرجع (أ * ب) / قاسم_مشترك_أكبر(أ, ب);
}
// الاستخدام
اطبع_صحيح(قاسم_مشترك_أكبر(48, 18)); // 6
اطبع_صحيح(مضاعف_مشترك_أصغر(4, 6)); // 12
دالة أولي(ن: صحيح) -> منطقي {
إذا ن < 2 {
أرجع خطأ;
}
إذا ن == 2 {
أرجع صح;
}
إذا ن % 2 == 0 {
أرجع خطأ;
}
دع متغير ت = 3;
طالما ت * ت <= ن {
إذا ن % ت == 0 {
أرجع خطأ;
}
ت += 2;
}
أرجع صح;
}
// غربال إراتوستينس
دالة أولية_حتى(حد: صحيح) -> متجه<صحيح> {
دع متغير أولي: [منطقي; 1000] = [صح; 1000];
دع متغير نتيجة: متجه<صحيح> = متجه[];
أولي[0] = خطأ;
أولي[1] = خطأ;
لكل ت في 2..حد {
إذا أولي[ت] {
نتيجة.ادفع(ت);
دع متغير ج = ت * 2;
طالما ج < حد {
أولي[ج] = خطأ;
ج += ت;
}
}
}
أرجع نتيجة;
}
دالة عكس_نص(نص: نص) -> نص {
دع متغير نتيجة = "";
دع ط = طول(نص);
دع متغير ت = ط - 1;
طالما ت >= 0 {
// إضافة الحرف
ت -= 1;
}
أرجع نتيجة;
}

التحقق من متناظر (Palindrome)

Section titled “التحقق من متناظر (Palindrome)”
دالة متناظر(أعداد: [صحيح; 10], طول: صحيح) -> منطقي {
دع متغير يسار = 0;
دع متغير يمين = طول - 1;
طالما يسار < يمين {
إذا أعداد[يسار] != أعداد[يمين] {
أرجع خطأ;
}
يسار += 1;
يمين -= 1;
}
أرجع صح;
}
// الاستخدام
دع بيانات1 = [1, 2, 3, 2, 1, 0, 0, 0, 0, 0];
دع بيانات2 = [1, 2, 3, 4, 5, 0, 0, 0, 0, 0];
إذا متناظر(بيانات1, 5) {
اطبع("متناظر"); // يُطبع
}
إذا متناظر(بيانات2, 5) {
اطبع("متناظر"); // لا يُطبع
}

حساب قيمة π (مونت كارلو)

Section titled “حساب قيمة π (مونت كارلو)”
دالة احسب_باي(عدد_النقاط: صحيح) -> عشري {
دع متغير داخل_الدائرة = 0;
لكل ت في 0..عدد_النقاط {
// توليد نقطة عشوائية بين 0 و 1
دع س = عشوائي_عشري();
دع ص = عشوائي_عشري();
// التحقق إذا داخل الدائرة
إذا (س * س + ص * ص) <= 1.0 {
داخل_الدائرة += 1;
}
}
// π ≈ 4 × (النقاط داخل الدائرة / إجمالي النقاط)
أرجع 4.0 * (داخل_الدائرة كـ عشري) / (عدد_النقاط كـ عشري);
}
دالة طول_كولاتز(ن: ص64) -> صحيح {
دع متغير عدد = ن;
دع متغير خطوات = 0;
طالما عدد != 1 {
إذا عدد % 2 == 0 {
عدد = عدد / 2;
} وإلا {
عدد = 3 * عدد + 1;
}
خطوات += 1;
}
أرجع خطوات;
}
// الاستخدام
اطبع_صحيح(طول_كولاتز(27)); // 111 خطوة