שאלה - JS - איך לכתוב את זה בצורה פשוטה יותר?

  • הוסף לסימניות
  • #1
אני כותבת פונקצייה שתבדוק אם מספר מסוים נמצא במערךמסוים, ויחזיר את האינדקס שלו.
(ואם המספר לא במערך שיחזיר -1)
כתבתי כך:
קוד:
/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max > min && array[guess] !== targetValue){
        guess = round(min + max)/2;
        if(array[guess] === targetValue){
            return(array[guess]);
        }
        else if (guess < targetValue){min = guess + 1;}
        else {max = guess - 1;}
       
    }
    return (-1);

};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
println("Found prime at index " + result);
וכתבו לי:
לא צריך להשתמש ב-|| או אופרטורים && במצב של לולאת ה-while שלך. נסה להשתמש במצב פשוט יותר.
אותו דבר כותבים לי על break.
איך אני יכולה לכתוב את זה בלי && או break?
 
נערך לאחרונה ב:
  • הוסף לסימניות
  • #6
הפונקציה שלך עושה חיפוש בינארי, שהוא באמת מאד יעיל, אבל יעבוד רק על מערך ממוין.
כדאי לציין את זה בשאלה כי לוקח זמן להבין את זה מהקוד
חוץ מזה, השורה הזאת- return(array[guess])
לא נכונה, כי במקום להחזיר את האינדקס שהוא הניחוש,
את מחזירה את הערך במערך שנמצא במיקום הזה - שהוא הערך שאותו חיפשת מראש
כלומר אם חפשת 5 הוא יחזיר לך 5, אז צריך לכתוב- return(guess)
וזה אמור לעבוד ככה.
לא הבנתי את ההערה שכתבו על הbreak ו while...

עריכה:
וגם התנאי השני בלולאה מיותר, כי ברגע שהפונקציה מוצאת את הערך,
היא יוצאת החוצה ומחזירה את האינדקס,
אז לא צריך לכתוב את התנאי הזה בלולאה, הreturn שובר את הלולאה...
 
  • הוסף לסימניות
  • #7
ככה הקוד נראה לי טוב יותר, אבל סדרתי אותו לפי JAVA, מקווה שזה טוב:unsure:

התנאי הזה (array[guess] !== targetValue) בWHILE
היה גורם לקוד מתי שהוא מוצא את המספר להחזיר -1 כי הקוד לא היה נכנס ללולאה ומחזיר תאינדקס
אין צורך בbreak כי ברגע שיגיע לRETURN הוא יעצור תלולאה...

וכמובן שהקוד הזה עובד רק על מערך ממוין

קוד:
קוד:

var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
      while(max > min){
        guess = round(min + max)/2;
            if(array[guess] === targetValue)
                 return(guess);
                else if (guess < targetValue)
                     min = guess + 1;
                    else
                        max = guess - 1;
    }
    return (-1);

};
var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
var result = doSearch(primes, 73);
println("Found prime at index " + result);
 
נערך לאחרונה ב:
  • הוסף לסימניות
  • #8
ככה הקוד נראה לי טוב יותר, אבל סדרתי אותו לפי JAVA, מקווה שזה טוב:unsure:

התנאי הזה (array[guess] !== targetValue) בWHILE
היה גורם לקוד מתי שהוא מוצא את המספר להחזיר -1 כי הקוד לא היה נכנס ללולאה ומחזיר תאינדקס
אין צורך בbreak כי ברגע שיגיע לRETURN הוא יעצור תלולאה...

וכמובן שהקוד הזה עובד רק על מערך ממוין

קוד:
קוד:

var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
      while(max > min){
          guess= round( max-min+1);
            if(array[guess] === targetValue)
                 return(guess);
                else if (guess < targetValue)
                     min = guess + 1;
                    else
                        max = guess - 1;
    }
    return (-1);

};
var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
var result = doSearch(primes, 73);
println("Found prime at index " + result);
זה בערך מה שאני כתבתי...
אבל שימי לב שצריך לחלק לשתיים, ולא לעשות max-min+1
 
  • הוסף לסימניות
  • #10
שינתי תהגרלה, מה שאני שמתי זה לפי JAVA, לא יודעת איך מגרילים בJS
למה להגריל?
הכי יעיל לקחת כל פעם בדיוק את האמצע, לא צריך להגריל מספר...
משהו כמו 2/min+(max-min) ואז round, למקרה של אמצע לא זוגי
 
  • הוסף לסימניות
  • #11
למה להגריל?
הכי יעיל לקחת כל פעם בדיוק את האמצע, לא צריך להגריל מספר...
משהו כמו 2/min+(max-min) ואז round, למקרה של אמצע לא זוגי
סידרתי, צודקת
 
  • הוסף לסימניות
  • #12
עכשיו זה ככה :
אבל זה עדיין לא טוב, מה עוד צריך לשנות?
JavaScript:
/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max > min){
        guess = round(min + max)/2;
        if(array[guess] === targetValue){
            return(guess);
        }
        else if (guess < targetValue){min = guess + 1;}
        else {max = guess - 1;}
      
    }
    return (-1);

};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
println("Found prime at index " + result);
 
  • הוסף לסימניות
  • #13
עכשיו זה ככה :
אבל זה עדיין לא טוב, מה עוד צריך לשנות?
JavaScript:
/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max > min){
        guess = round(min + max)/2;
        if(array[guess] === targetValue){
            return(guess);
        }
        else if (guess < targetValue){min = guess + 1;}
        else {max = guess - 1;}
     
    }
    return (-1);

};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
println("Found prime at index " + result);
זה גאווה או ג'אווה סקריפט?
כי הקוד הוא בגאווה, אבל בכותרת כתבת ג'אווה סקריפט...
ושימי לב, החלקי שתים נמצא מחוץ ל-round, לכן זה לא עובד,
תכתבי- guess = round((min + max)/2);
 
  • הוסף לסימניות
  • #14
זה גאווה או ג'אווה סקריפט?
כי הקוד הוא בגאווה, אבל בכותרת כתבת ג'אווה סקריפט...
ושימי לב, החלקי שתים נמצא מחוץ ל-round, לכן זה לא עובד,
תכתבי- guess = round((min + max)/2);
בוודאי שג'אווה סקריפט
מה פה בג'אווה?
(אולי התבלבלתי?)
 
  • הוסף לסימניות
  • #15
בוודאי שג'אווה סקריפט
מה פה בג'אווה?
(אולי התבלבלתי?)
הנה זה הקוד בג'אווה סקריפט...
בדקתי וזה עובד...
וגם שיניתי את התנאי של הלולאה ל-גדול שווה, והיו עוד כמה תיקונים, שימי לב...
(לדוג' בין האינדקס לערך, במערך שבמיקום האינדקס, וגם התנאי guess<targetValue לא נכון)
JavaScript:
const doSearch = (array, targetValue)=> {
    let min = 0;
    let max = array.length - 1;
    let guess
    while(max >= min){
        guess = Math.floor((min + max)/2)
        if(array[guess] === targetValue){
            return(guess);
        }
        else if (array[guess] < targetValue){min = guess + 1;}
        else {max = guess - 1;}
     
    }
    return (-1);

};

const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

let result = doSearch(primes, 73);
console.log("Found prime at index " + result)
 
  • הוסף לסימניות
  • #16
הנה זה הקוד בג'אווה סקריפט...
בדקתי וזה עובד...
וגם שיניתי את התנאי של הלולאה ל-גדול שווה, והיו עוד כמה תיקונים, שימי לב...
(לדוג' בין האינדקס לערך, במערך שבמיקום האינדקס, וגם התנאי guess<targetValue לא נכון)
JavaScript:
const doSearch = (array, targetValue)=> {
    let min = 0;
    let max = array.length - 1;
    let guess
    while(max >= min){
        guess = Math.floor((min + max)/2)
        if(array[guess] === targetValue){
            return(guess);
        }
        else if (array[guess] < targetValue){min = guess + 1;}
        else {max = guess - 1;}
    
    }
    return (-1);

};

const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

let result = doSearch(primes, 73);
console.log("Found prime at index " + result)
אפשר להגדיר משתנים בג'אווה סקריפט גם עם var
והקוד הבסיסי היה עם var אז אני מעדיפה לא לשנות
 
  • הוסף לסימניות
  • #17
אפשר להגדיר משתנים בג'אווה סקריפט גם עם var
והקוד הבסיסי היה עם var אז אני מעדיפה לא לשנות
זה לא רק ה-var, יש עוד כמה דברים שונים, לדוג'- console.log במקום println...
וסתם ככה, נכון שאפשר לכתוב גם עם var, אבל יותר נכון לכתוב עם let, וזה לא ישנה לך כלום מבחינת הקוד...
 
  • הוסף לסימניות
  • #18
בכל מקרה זה עכשיו הקוד, ומשום מה זה עדיין לא עובד לי, למה?
(זה בדיקה ממוחשבת ואם זה לא נכון עד הפסיק האחרון זה לא עובר (לכן אני גם לא רוצה להחליף כמו שאמרת כי בקוד הבסיסי היה כתוב ככה, וזה לא יעבור אם אני ישנה את זה))
JavaScript:
/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max >= min){
        guess = floor((max+min)/2);
        if(array[guess] === targetValue){return(guess);}
            else if (guess < targetValue){min = guess + 1;}
            else{max = guess - 1;}
    }
    return -1;

};
var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
var result = doSearch(primes, 73);
println("Found prime at index " + result);
//Program.assertEqual(doSearch(primes, 73), 20);
 
  • הוסף לסימניות
  • #19
בכל מקרה זה עכשיו הקוד, ומשום מה זה עדיין לא עובד לי, למה?

אולי תשתמשי בדיבגר ?
או פשוט תוסיפי הדפסות בתוך הלולאה של ערכי המשתנים בכל איטרציה?
כך תוכלי לעקוב מה קורה ולתפוס איפה הבאג.
 
  • הוסף לסימניות
  • #20
אז ממש תודה לכולכם!
סוף סוף הצלחתי
(הקוד הוא:
JavaScript:
/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(max >= min){
        guess = floor((max+min)/2);
        if(array[guess] === targetValue){return(guess);}
            else if (array[guess] < targetValue){min = guess + 1;}
            else{max = guess - 1;}

    
    }
return -1;
};
var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
var result = doSearch(primes, 73);
println("Found prime at index " + result);

)
 

פרוגבוט

תוכן שיווקי
פרסומת

פוסטים חדשים שאולי לא קראת....

הצטרפות לניוזלטר

איזה כיף שהצטרפתם לניוזלטר שלנו!

מעכשיו, תהיו הראשונים לקבל את כל העדכונים, החדשות, ההפתעות בלעדיות, והתכנים הכי חמים שלנו בפרוג!

לוח מודעות

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק כה

אלְדָוִד אֵלֶיךָ יי נַפְשִׁי אֶשָּׂא:באֱלֹהַי בְּךָ בָטַחְתִּי אַל אֵבוֹשָׁה אַל יַעַלְצוּ אֹיְבַי לִי:גגַּם כָּל קוֶֹיךָ לֹא יֵבֹשׁוּ יֵבֹשׁוּ הַבּוֹגְדִים רֵיקָם:דדְּרָכֶיךָ יי הוֹדִיעֵנִי אֹרְחוֹתֶיךָ לַמְּדֵנִי:ההַדְרִיכֵנִי בַאֲמִתֶּךָ וְלַמְּדֵנִי כִּי אַתָּה אֱלֹהֵי יִשְׁעִי אוֹתְךָ קִוִּיתִי כָּל הַיּוֹם:וזְכֹר רַחֲמֶיךָ יי וַחֲסָדֶיךָ כִּי מֵעוֹלָם הֵמָּה:זחַטֹּאות נְעוּרַי וּפְשָׁעַי אַל תִּזְכֹּר כְּחַסְדְּךָ זְכָר לִי אַתָּה לְמַעַן טוּבְךָ יי:חטוֹב וְיָשָׁר יי עַל כֵּן יוֹרֶה חַטָּאִים בַּדָּרֶךְ:טיַדְרֵךְ עֲנָוִים בַּמִּשְׁפָּט וִילַמֵּד עֲנָוִים דַּרְכּוֹ:יכָּל אָרְחוֹת יי חֶסֶד וֶאֱמֶת לְנֹצְרֵי בְרִיתוֹ וְעֵדֹתָיו:יאלְמַעַן שִׁמְךָ יי וְסָלַחְתָּ לַעֲוֹנִי כִּי רַב הוּא:יבמִי זֶה הָאִישׁ יְרֵא יי יוֹרֶנּוּ בְּדֶרֶךְ יִבְחָר:יגנַפְשׁוֹ בְּטוֹב תָּלִין וְזַרְעוֹ יִירַשׁ אָרֶץ:ידסוֹד יי לִירֵאָיו וּבְרִיתוֹ לְהוֹדִיעָם:טועֵינַי תָּמִיד אֶל יי כִּי הוּא יוֹצִיא מֵרֶשֶׁת רַגְלָי:טזפְּנֵה אֵלַי וְחָנֵּנִי כִּי יָחִיד וְעָנִי אָנִי:יזצָרוֹת לְבָבִי הִרְחִיבוּ מִמְּצוּקוֹתַי הוֹצִיאֵנִי:יחרְאֵה עָנְיִי וַעֲמָלִי וְשָׂא לְכָל חַטֹּאותָי:יטרְאֵה אוֹיְבַי כִּי רָבּוּ וְשִׂנְאַת חָמָס שְׂנֵאוּנִי:כשָׁמְרָה נַפְשִׁי וְהַצִּילֵנִי אַל אֵבוֹשׁ כִּי חָסִיתִי בָךְ:כאתֹּם וָיֹשֶׁר יִצְּרוּנִי כִּי קִוִּיתִיךָ:כבפְּדֵה אֱלֹהִים אֶת יִשְׂרָאֵל מִכֹּל צָרוֹתָיו:
נקרא  2  פעמים
למעלה