Scala for the Impatient,第2章,关于递归pow函数的练习

时间:2017-05-07 07:39:04

标签: scala

我正在阅读Scala for the Impatient,第2章,还有一个练习题,我不明白它到底想要什么:

  

编写一个计算x ^ n的函数,其中n是一个整数。使用   遵循递归定义:

     
      
  • X ^ n = y * y如果n是偶数且正数,则y = x ^(n / 2)
  •   
  • X ^ n = x * x ^(n-1),如果n为奇数且为正
  •   
  • x ^ 0 = 1
  •   
  • x ^ n = 1 / x ^ -n如果n为负
  •   

如果问题需要x ^ n,我可以使用scala.math中定义的pow方法:

redis-server.exe redis.windows.conf

2 个答案:

答案 0 :(得分:2)

问题是要求(重新)在整数上实现递归的pow函数:

<?php
//get all terms (e.g. categories or post tags), then display all posts in each term
$taxonomy = 'category';//  e.g. post_tag, category
$param_type = 'category__in'; //  e.g. tag__in, category__in
$term_args=array(
  'orderby' => 'name',
  'order' => 'ASC'
);
$terms = get_terms($taxonomy,$term_args);
if ($terms) {
  foreach( $terms as $term ) {
    $args=array(
      "$param_type" => array($term->term_id),
      'post_type' => 'post',
      'post_status' => 'publish',
      'posts_per_page' => 3,
      'caller_get_posts'=> 1,
      );
    $my_query = null;
    $my_query = new WP_Query($args);
    if( $my_query->have_posts() ) {
      echo 'List of Posts in '.$taxonomy .' '.$term->name;
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>


<?php
if (has_post_thumbnail($post->ID)) {
        $retina  = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'homepage-thumb-retina' );
        echo '<img src="' . $retina[0] . '" alt="' . the_title() . '" width="24" height="24" />' ;
};

      endwhile;
    }
  }
}
wp_reset_query();  // Restore global post data stomped by the_post().
?>

您需要编写比天真def pow(x: Int, y: Int): Int = ... 算法更智能的实现:

O(n)

尝试使用给定的递归定义......

要直接回答您的问题,我不认为您可以使用def slowPow(x: Int, y: Int): Int = if (y == 0) 1 else x * slowPow(x, y - 1) 中的问题回避问题。如您所述,它仅适用于scala.math。也不是递归的,也不是Doubles中实现的。

答案 1 :(得分:0)

def pow(x: Double, n: Int): Double = {
  if (n == 0) 1
  else if (n < 0) 1 / (x - n)
  else if (n % 2 == 1) x * pow(x, n - 1)
  else {
    val y = pow(x, n / 2)
    y * y
  }
}

pow(2, 0) == 1
pow(2, -2) == 0.25
pow(2, 4) == 16
pow(2, 5) == 32