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

הוסטס - פורום אחסון האתרים הגדול בישראל (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 עזר

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

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


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

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