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

(חיה)

משתמש סופר מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
הנדסת תוכנה
אני כותבת פונקצייה שתבדוק אם מספר מסוים נמצא במערךמסוים, ויחזיר את האינדקס שלו.
(ואם המספר לא במערך שיחזיר -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?
 
נערך לאחרונה ב:

(:1234

משתמש סופר מקצוען
איור וציור מקצועי
הנדסת תוכנה
הפונקציה שלך עושה חיפוש בינארי, שהוא באמת מאד יעיל, אבל יעבוד רק על מערך ממוין.
כדאי לציין את זה בשאלה כי לוקח זמן להבין את זה מהקוד
חוץ מזה, השורה הזאת- return(array[guess])
לא נכונה, כי במקום להחזיר את האינדקס שהוא הניחוש,
את מחזירה את הערך במערך שנמצא במיקום הזה - שהוא הערך שאותו חיפשת מראש
כלומר אם חפשת 5 הוא יחזיר לך 5, אז צריך לכתוב- return(guess)
וזה אמור לעבוד ככה.
לא הבנתי את ההערה שכתבו על הbreak ו while...

עריכה:
וגם התנאי השני בלולאה מיותר, כי ברגע שהפונקציה מוצאת את הערך,
היא יוצאת החוצה ומחזירה את האינדקס,
אז לא צריך לכתוב את התנאי הזה בלולאה, הreturn שובר את הלולאה...
 

רבקי:)

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
הנדסת תוכנה
צילום מקצועי
עריכה והפקת סרטים
ככה הקוד נראה לי טוב יותר, אבל סדרתי אותו לפי 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);
 
נערך לאחרונה ב:

(:1234

משתמש סופר מקצוען
איור וציור מקצועי
הנדסת תוכנה
ככה הקוד נראה לי טוב יותר, אבל סדרתי אותו לפי 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
 

(:1234

משתמש סופר מקצוען
איור וציור מקצועי
הנדסת תוכנה
שינתי תהגרלה, מה שאני שמתי זה לפי JAVA, לא יודעת איך מגרילים בJS
למה להגריל?
הכי יעיל לקחת כל פעם בדיוק את האמצע, לא צריך להגריל מספר...
משהו כמו 2/min+(max-min) ואז round, למקרה של אמצע לא זוגי
 

רבקי:)

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
הנדסת תוכנה
צילום מקצועי
עריכה והפקת סרטים
למה להגריל?
הכי יעיל לקחת כל פעם בדיוק את האמצע, לא צריך להגריל מספר...
משהו כמו 2/min+(max-min) ואז round, למקרה של אמצע לא זוגי
סידרתי, צודקת
 

(חיה)

משתמש סופר מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
הנדסת תוכנה
עכשיו זה ככה :
אבל זה עדיין לא טוב, מה עוד צריך לשנות?
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);
 

(:1234

משתמש סופר מקצוען
איור וציור מקצועי
הנדסת תוכנה
עכשיו זה ככה :
אבל זה עדיין לא טוב, מה עוד צריך לשנות?
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);
 

(חיה)

משתמש סופר מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
הנדסת תוכנה
זה גאווה או ג'אווה סקריפט?
כי הקוד הוא בגאווה, אבל בכותרת כתבת ג'אווה סקריפט...
ושימי לב, החלקי שתים נמצא מחוץ ל-round, לכן זה לא עובד,
תכתבי- guess = round((min + max)/2);
בוודאי שג'אווה סקריפט
מה פה בג'אווה?
(אולי התבלבלתי?)
 

(:1234

משתמש סופר מקצוען
איור וציור מקצועי
הנדסת תוכנה
בוודאי שג'אווה סקריפט
מה פה בג'אווה?
(אולי התבלבלתי?)
הנה זה הקוד בג'אווה סקריפט...
בדקתי וזה עובד...
וגם שיניתי את התנאי של הלולאה ל-גדול שווה, והיו עוד כמה תיקונים, שימי לב...
(לדוג' בין האינדקס לערך, במערך שבמיקום האינדקס, וגם התנאי 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)
 

(חיה)

משתמש סופר מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
הנדסת תוכנה
הנה זה הקוד בג'אווה סקריפט...
בדקתי וזה עובד...
וגם שיניתי את התנאי של הלולאה ל-גדול שווה, והיו עוד כמה תיקונים, שימי לב...
(לדוג' בין האינדקס לערך, במערך שבמיקום האינדקס, וגם התנאי 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 אז אני מעדיפה לא לשנות
 

(:1234

משתמש סופר מקצוען
איור וציור מקצועי
הנדסת תוכנה
אפשר להגדיר משתנים בג'אווה סקריפט גם עם var
והקוד הבסיסי היה עם var אז אני מעדיפה לא לשנות
זה לא רק ה-var, יש עוד כמה דברים שונים, לדוג'- console.log במקום println...
וסתם ככה, נכון שאפשר לכתוב גם עם var, אבל יותר נכון לכתוב עם let, וזה לא ישנה לך כלום מבחינת הקוד...
 

(חיה)

משתמש סופר מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
הנדסת תוכנה
בכל מקרה זה עכשיו הקוד, ומשום מה זה עדיין לא עובד לי, למה?
(זה בדיקה ממוחשבת ואם זה לא נכון עד הפסיק האחרון זה לא עובר (לכן אני גם לא רוצה להחליף כמו שאמרת כי בקוד הבסיסי היה כתוב ככה, וזה לא יעבור אם אני ישנה את זה))
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);
 

B HAPPY

משתמש מקצוען
D I G I T A L
בכל מקרה זה עכשיו הקוד, ומשום מה זה עדיין לא עובד לי, למה?

אולי תשתמשי בדיבגר ?
או פשוט תוסיפי הדפסות בתוך הלולאה של ערכי המשתנים בכל איטרציה?
כך תוכלי לעקוב מה קורה ולתפוס איפה הבאג.
 

(חיה)

משתמש סופר מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
הנדסת תוכנה
אז ממש תודה לכולכם!
סוף סוף הצלחתי
(הקוד הוא:
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);

)
 

אולי מעניין אותך גם...

הפרק היומי

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


תהילים פרק קל

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

אתגר AI

ממה זה עשוי...? • אתגר 16

לוח מודעות

למעלה