|
CS 3343/3341 Analysis of Algorithms Spring 2012 Recitation 2 Elementary Recursion Partial Answers |
1 + (1/2) + (1/3) + . . . + (1/(n-1)) + (1/n).Write a second function harmonic2 (in Java or C or both) without using a loop, but using recursion. Here's everything in one program:
// Harmonic.java: harmonic function public class Harmonic { static double harmonic0(int n) { double res = 0.0; while (n > 0) { res += 1.0/n; n = n - 1; } return res; } static double harmonic(int n) { if (n == 1) return 1; return 1.0/n + harmonic(n - 1); } public static void main(String[] args) { int n = 1000000000; double res; System.out.println("harmonic0:\n"); res = harmonic0(n); System.out.println(res); System.out.println("harmonic:\n"); res = harmonic0(n); System.out.println(res); System.out.println(res - Math.log(n)); } } | // harmonic.c: harmonic function #include |
[with n = 1000000000 above, got, after 18 secs] harmonic0: 21.30048150234615 [another 18 secs] harmonic: 21.30048150234615 0.57721 56653 99737 8 [Correct to 10 places. True value, Euler's Const: 0.57721 56649 01532 86060 65120] | [with N = 1000000000, got after 20 seconds] 21.3004815023434091 0.57721 56653 96998 6 [recursive part ran for N = 100000, gave segmentation fault with N = 1000000] |