הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   PHP | רקורסיה פשוטה דרך ארוכה מידי (https://hosts.co.il/forums/showthread.php?t=74286)

Labs 06-05-09 16:17

PHP | רקורסיה פשוטה דרך ארוכה מידי
 
היי
אני כותב את זה מהאייפוד לכן לא אוכל להציג את הקוד שלי

לא מזמן סתם בישביל הכיף בניתי רקורסיה שעושה לי דבר כזה
\/
\\//
\\\///
///\\\
//\\
/\
יצא לי דרך קצת ארוכה מידי הייתי רוצה לראות איך אחרים יעשו את זה

אני יחזור הביתה אני יעלה לפה את הקוד שלי

דן.

vadimg88 06-05-09 17:20

ואת זה אתה עושה בישביל?

daMn 07-05-09 00:33

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 713384)
ואת זה אתה עושה בישביל?

ציטוט:

נכתב במקור על ידי Labs (פרסם 713349)
לא מזמן סתם בישביל הכיף בניתי רקורסיה שעושה לי דבר כזה

דווקא אהבתי את הרעיון וניסיתי, אולי בגלל שאני עייף יצא לי קצת עקום אבל עושה את העבודה.
PHP קוד:

function recursion($level$top) {
    static 
$ret;
    
$ret .= str_repeat("/"$top-$level+1) . str_repeat("\\"$top-$level+1) . "<br />";
    if (
$level 0) {
        
recursion($level-1$top);
    }
    
$ret .= str_repeat("\\"$top-$level+1) . str_repeat("/"$top-$level+1) . "<br />";
    return 
$ret;
}

echo 
recursion(33); 

הפרמטר הראשון מקבל את כמות השלבים שאתה רוצה לעשות למעויין שייצא, והפרמטר השני הייתי חייב כי זה מעויין, אפשר להסתדר בלי הפרמטר השני ואז ייצא משהו כזה:
///\\\
//\\
/\
\/
\\//
\\\///

יהיה נחמד לראות אם מישהו יצליח לשפר את מה שעשיתי.

daMn 07-05-09 00:54

בסוף סידרתי תפונקציה, לא עמדתי בזה |קורץ|
PHP קוד:

function recursion($level$top) {
    static 
$ret;
    
$newline = ($top-$level === 0) ? "" "<br />\n";
    
$ret .= str_repeat("/"$top-$level) . str_repeat("\\"$top-$level) . $newline;
    if (
$level 0) {
        
recursion($level-1$top);
    }
    
$ret .= str_repeat("\\"$top-$level) . str_repeat("/"$top-$level) . $newline;
    return 
$ret;
}

echo 
recursion(33); 

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

Inet 07-05-09 09:00

ציטוט:

נכתב במקור על ידי daMn (פרסם 713451)
בסוף סידרתי תפונקציה, לא עמדתי בזה |קורץ|
PHP קוד:

function recursion($level$top) {
    static 
$ret;
    
$newline = ($top-$level === 0) ? "" "<br />\n";
    
$ret .= str_repeat("/"$top-$level) . str_repeat("\\"$top-$level) . $newline;
    if (
$level 0) {
        
recursion($level-1$top);
    }
    
$ret .= str_repeat("\\"$top-$level) . str_repeat("/"$top-$level) . $newline;
    return 
$ret;
}

echo 
recursion(33); 

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

הפרמטר השני מיותר - הוא תמיד יהיה שווה לlevel כדי שזה יראה כמו שצריך.

daMn 07-05-09 14:22

ציטוט:

נכתב במקור על ידי Inet (פרסם 713463)
הפרמטר השני מיותר - הוא תמיד יהיה שווה לlevel כדי שזה יראה כמו שצריך.

אתה מוזמן להריץ ולבדוק שאתה טועה, וגם בלי להריץ אפשר לראות שהוא לא משתנה.

Labs 07-05-09 14:24

ציטוט:

נכתב במקור על ידי daMn (פרסם 713451)
בסוף סידרתי תפונקציה, לא עמדתי בזה |קורץ|
PHP קוד:

function recursion($level$top) {
    static 
$ret;
    
$newline = ($top-$level === 0) ? "" "<br />\n";
    
$ret .= str_repeat("/"$top-$level) . str_repeat("\\"$top-$level) . $newline;
    if (
$level 0) {
        
recursion($level-1$top);
    }
    
$ret .= str_repeat("\\"$top-$level) . str_repeat("/"$top-$level) . $newline;
    return 
$ret;
}

echo 
recursion(33); 

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


עשיתי בדיוק אותו דבר רק במקום ה STR REPEAT השתמשתי בFORים... ואת הNEWLINE שילבתי לתוך שם זה לא משנה אם הוא יעשה עוד שורה ריקה למטה

ציטוט:

נכתב במקור על ידי Inet (פרסם 713463)
הפרמטר השני מיותר - הוא תמיד יהיה שווה לlevel כדי שזה יראה כמו שצריך.

לא נכון =\
הוא כל פעם מחסיר מLEVEL
כל הקטע ברקורסיה...

אגב אפשר להחשיב את הצורה הזאת כפרקטל?

intercooler3819 07-05-09 22:37

אני חושב שניצחתי אם מדובר באורך הקוד D:

PHP קוד:

<?php
function nitsana ($n$b='')
{
    return 
$n == $b nitsana($n-1str_repeat('[',$n).str_repeat(']',$n) ."\n".$b.str_repeat('[',$n).str_repeat(']',$n)."\n");
}

function 
nitsanb ($n$l=0$b='')
{
    
$l $l == $l 2*$n $l $l;
    return 
$n == $b nitsanb($n-1$lstr_repeat(' ',ceil($l-(2*$n))).str_repeat('[',$n).str_repeat(']',$n)."\n".$b.str_repeat(' ',ceil($l-(2*$n))).str_repeat('[',$n).str_repeat(']',$n)."\n");
}

function 
nitsanc ($n$l=0$b='')
{
    
$l $l == $l $n $l $l;
    return 
$n == $b nitsanc($n-1$lstr_repeat(' ',ceil($l-$n)).str_repeat('[',$n).str_repeat(']',$n)."\n".$b.str_repeat(' ',ceil($l-$n)).str_repeat('[',$n).str_repeat(']',$n)."\n");
}

echo 
nitsana(5);
echo 
"\n\n\n";
echo 
nitsanb(5);
echo 
"\n\n\n";
echo 
nitsanc(5);
?>

והפלט:
קוד:

[]
[[]]
[[[]]]
[[[[]]]]
[[[[[]]]]]
[[[[[]]]]]
[[[[]]]]
[[[]]]
[[]]
[]



        []
      [[]]
    [[[]]]
  [[[[]]]]
[[[[[]]]]]
[[[[[]]]]]
  [[[[]]]]
    [[[]]]
      [[]]
        []



    []
  [[]]
  [[[]]]
 [[[[]]]]
[[[[[]]]]]
[[[[[]]]]]
 [[[[]]]]
  [[[]]]
  [[]]
    []


ובנוגע לפרקטל
אם אתה מדבר על הפרקטל המתמטי - אז לא

daMn 08-05-09 01:54

נחמד ניצן אבל הבעיה בצורה שהוא ביקש, אתה חייב לבצע שורה לפני ואחרי הרקורסיה שתצא צורה של מעויין.
\/
/\

ali_napso 08-05-09 08:26

ציטוט:

נכתב במקור על ידי daMn (פרסם 713612)
נחמד ניצן אבל הבעיה בצורה שהוא ביקש, אתה חייב לבצע שורה לפני ואחרי הרקורסיה שתצא צורה של מעויין.
\/
/\

על מה אתה מדבר? הוא פשוט יכול להחליף את הסימן בו הוא משתמש......

אפשר לעשות את זה עם משתנה אחד אבל עם 3 פונקציות
1 ראשית ו2 עזר

בראשית אתה רק מבצע את הפומקציות עזר ובפונקצייות העזר

אתה צריך משתנה אחד שזה הוא מספר הקומות במשולש

intercooler3819 08-05-09 09:20

ציטוט:

נכתב במקור על ידי daMn (פרסם 713612)
נחמד ניצן אבל הבעיה בצורה שהוא ביקש, אתה חייב לבצע שורה לפני ואחרי הרקורסיה שתצא צורה של מעויין.
\/
/\

תחליף את [ ואת ] ב \ וב /

אני פשוט שונא לעשות ESCAPING |Lol|

daMn 08-05-09 11:11

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 713633)
תחליף את [ ואת ] ב \ וב /

אני פשוט שונא לעשות ESCAPING |Lol|

כן צודק לא שמתי לב, חשבתי שבגלל זה יצא לך קצר, לא קראתי את הקוד עד הסוף.

intercooler3819 08-05-09 11:15

ציטוט:

נכתב במקור על ידי daMn (פרסם 713645)
כן צודק לא שמתי לב, חשבתי שבגלל זה יצא לך קצר, לא קראתי את הקוד עד הסוף.

הקוד שלי יותר קצר כי הוא מיישם את העקרונות של הרקורסיה
אני הולך מבפנים החוצה ולא מבחוץ לבפנים |קורץ|

קודם כל מדפיס את המרכז ולאט לאט מתפזר החוצה

אבל רקורסיה בWEB DEVELOPMENT זה משהו שצריך להמנע ממנו וכמה קצרה או לא קצרה שהרקורסיה שלך תהיה אם אפשר לבצע אותה עם לולאות זה עדיף - ובהרבה!

|קורץ|

Shay Ben Moshe 08-05-09 11:32

לי באופן אישי אין מושג מה זה רקורסיה, אני יודע לעשות את מה שעשיתם רק בעזרת לולאות ובטוח אפשר לפשט את זה.. אבל לדעתי זה גם לא רע :)

PHP קוד:

function shay($len=6) {
    static 
$text;
    for(
$i=1;$i<=$len/2;$i++) $text .= str_repeat("/",$i).str_repeat("\\",$i)."<br />";
    for(
$i=$len/2;$i>=1;$i--) $text .= str_repeat("\\",$i).str_repeat("/",$i)."<br />";
    return 
$text;
}

echo 
shay(6); 


Labs 08-05-09 17:39

במקום לעשות ESCAPING אני פשוט השתמשתי בקוד האסקיי שלהם =\


כל הזמנים הם GMT +2. הזמן כעת הוא 16:14.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ