.= 'tag.htm'; break; case 'flag': $pre .= $default_pre .= 'flag.htm'; break; case 'my': $pre .= $default_pre .= 'my.htm'; break; case 'my_password': $pre .= $default_pre .= 'my_password.htm'; break; case 'my_bind': $pre .= $default_pre .= 'my_bind.htm'; break; case 'my_avatar': $pre .= $default_pre .= 'my_avatar.htm'; break; case 'home_article': $pre .= $default_pre .= 'home_article.htm'; break; case 'home_comment': $pre .= $default_pre .= 'home_comment.htm'; break; case 'user': $pre .= $default_pre .= 'user.htm'; break; case 'user_login': $pre .= $default_pre .= 'user_login.htm'; break; case 'user_create': $pre .= $default_pre .= 'user_create.htm'; break; case 'user_resetpw': $pre .= $default_pre .= 'user_resetpw.htm'; break; case 'user_resetpw_complete': $pre .= $default_pre .= 'user_resetpw_complete.htm'; break; case 'user_comment': $pre .= $default_pre .= 'user_comment.htm'; break; case 'single_page': $pre .= $default_pre .= 'single_page.htm'; break; case 'search': $pre .= $default_pre .= 'search.htm'; break; case 'operate_sticky': $pre .= $default_pre .= 'operate_sticky.htm'; break; case 'operate_close': $pre .= $default_pre .= 'operate_close.htm'; break; case 'operate_delete': $pre .= $default_pre .= 'operate_delete.htm'; break; case 'operate_move': $pre .= $default_pre .= 'operate_move.htm'; break; case '404': $pre .= $default_pre .= '404.htm'; break; case 'read_404': $pre .= $default_pre .= 'read_404.htm'; break; case 'list_404': $pre .= $default_pre .= 'list_404.htm'; break; default: $pre .= $default_pre .= theme_mode_pre(); break; } if ($config['theme']) { $conffile = APP_PATH . 'view/template/' . $config['theme'] . '/conf.json'; $json = is_file($conffile) ? xn_json_decode(file_get_contents($conffile)) : array(); } !empty($json['installed']) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . ($id ? $id . '_' : '') . $pre; (empty($path_file) || !is_file($path_file)) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . $pre; if (!empty($config['theme_child']) && is_array($config['theme_child'])) { foreach ($config['theme_child'] as $theme) { if (empty($theme) || is_array($theme)) continue; $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . ($id ? $id . '_' : '') . $pre; !is_file($path_file) and $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . $pre; } } !is_file($path_file) and $path_file = APP_PATH . ($dir ? 'plugin/' . $dir . '/view/htm/' : 'view/htm/') . $default_pre; return $path_file; } function theme_mode_pre($type = 0) { global $config; $mode = $config['setting']['website_mode']; $pre = ''; if (1 == $mode) { $pre .= 2 == $type ? 'portal_category.htm' : 'portal.htm'; } elseif (2 == $mode) { $pre .= 2 == $type ? 'flat_category.htm' : 'flat.htm'; } else { $pre .= 2 == $type ? 'index_category.htm' : 'index.htm'; } return $pre; } ?>javascript - Concatenation of a string using ternary operator and recursion - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Concatenation of a string using ternary operator and recursion - Stack Overflow

programmeradmin2浏览0评论

I try to understand this one. It is an example from advanced javascript by John Resig.

function yell(n) {
    return n > 0 ? yell(n-1) + "a" : "hiy";
}
alert( yell(4) );

As a beginner I somehow would use a temporary variable to save the string and concatenate it to the final word (here hiyaaaa).

I cannot understand how this advanced example is working. Where the concatenation happens and how? Why is "hiy" before the "a"'s at the end, if it is added last?

I try to understand this one. It is an example from advanced javascript by John Resig.

function yell(n) {
    return n > 0 ? yell(n-1) + "a" : "hiy";
}
alert( yell(4) );

As a beginner I somehow would use a temporary variable to save the string and concatenate it to the final word (here hiyaaaa).

I cannot understand how this advanced example is working. Where the concatenation happens and how? Why is "hiy" before the "a"'s at the end, if it is added last?

Share Improve this question edited Dec 30, 2017 at 0:32 Sébastien 12.1k12 gold badges59 silver badges82 bronze badges asked Dec 30, 2017 at 0:22 FritzlFritzl 437 bronze badges 1
  • 3 It is recursion. – Austin Brunkhorst Commented Dec 30, 2017 at 0:24
Add a ment  | 

4 Answers 4

Reset to default 6

This is recursion. The temporary variable is the return value of the call to yell. yell calls itself until n <= 0. The easiest way to understand this may be to intuitively write out the series of calls that will be made to yell.

yell(4) == yell(3) + "a"
yell(3) == yell(2) + "a"
yell(2) == yell(1) + "a"
yell(1) == yell(0) + "a"
yell(0) == "hiy"

Substitute the values and you will get the final value for yell(4).

The Conditional Operator is just a terse way of expressing a conditional statement with two cases. By replacing this usage of the operator with the expand if statement form, it may be easier to conceptualize.

function yell(n) {
    if (n > 0) {
        return yell(n-1) + "a";
    }

    return "hiy";
}

Let's walk through this...

This is just a function declaration and nothing happens when it is reached (besides the function being parsed into memory):

function yell(n){
  return n > 0 ? yell(n-1) + "a" : "hiy";
}

Now, the function is invoked and the number 4 is passed into it:

alert( yell(4) );

The 4 is received as the value of the argument n and then this line:

  return n > 0 ? yell(n-1) + "a" : "hiy";

...first checks n to see if it is greater than 0, which 4 is, so the true part of the ternary expression is carried out:

yell(n-1) + "a"

This makes a recursive call to yell and passes 3 (n - 1) to the function. Note that nothing is returned from the first call to yell yet, because flow control has been passed over to the second occurrence of yell.

The function runs again with 3 as n and again hits the true part of the ternary, causing the number to be reduced by one and then yell is called again.

This will continue until yell is recursively called with 0 as the value passed into it, at which time the false part of the ternary expression is invoked and hiy is returned and the aaaa from the recursive calls is concatenated onto that.

function yell(n){
  return n > 0 ? yell(n-1) + "a" : "hiy";
}
alert( yell(4) );

The ternary is just a shortcut for an if statement:

function yell(n) {
    var temp;
    if (n > 0) {
        temp = yell(n-1) + "a";
    } else {
        temp = "hiy";
    }
    return temp;
}

Multiple concatenation is happening because the function calls itself recursively with a smaller value of n. The final call (when n == 0) returns hiy. When each recursive call returns, it appends a to the result and returns that back to the previous caller.

function yell(n){
  if      (n > 3) {return yell(n-1) + "4"}
  else if (n > 2) {return yell(n-1) + "3"}
  else if (n > 1) {return yell(n-1) + "2"}
  else if (n > 0) {return yell(n-1) + "1"}
  else {return "0"} 
}
alert( yell(4) );

To see the order of each step of concatenation, I tried this. Still confusing, but at least I see how it works.

Thank you all for the useful answers!

发布评论

评论列表(0)

  1. 暂无评论