New Loop or no Loop, that is the question.
No Loop:
To get more posts, increase the $num in wp_get_recent_posts($num); the $num if missing is 10.
However, this function gets every post, drafts and all.
the_permalink() will only work inside "The Loop".
get_permalink( $post_ID ) can be used outside the The Loop; and you have the $post_ID in the wp_get_recent_posts array.
Poor Example usage to list 100 permalinks:
<?php
$num = (100);
$my_recent_posts = wp_get_recent_posts($num);
echo '<ul>';
foreach($my_recent_posts as $my_recent_post) {
echo '<li>';
echo get_permalink( $my_recent_post['ID'] ); //bare bones to illustrate
echo '</li>';
}
echo '</ul>';
?>
I wouldn't generate a list this way, because drafts are included.
New Loop:
Instead I would construct a second Loop using a "new WP_Query".
http://codex.wordpress.org/The_Loop#Multiple_Loops_Example_1
Better Example
<?php
$number = '100';
$r = new WP_Query(array('showposts' => $number, 'what_to_show' => 'posts', 'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1));
if ($r->have_posts()) :
?>
<ul>
<?php while ($r->have_posts()) : $r->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?> </a></li>
<?php endwhile; ?>
</ul>
<?php
wp_reset_query();
endif;
?>