Consider the following definition of the gcd_list function that, when completed, will compute the greatest common divisor of a list of numbers:
1. var gcd_list = function (ns) {
2. var gcd_list_cps = function (ns,k) {
3. if ( ????? ) {
4. return "Cannot ask for the gcd of the empty list";
5. } else if ( ????? ) {
6. return 1;
7. } else if ( ????? ) {
8. return k(fp.hd(ns));
9. } else {
10. return gcd_list_cps( fp.tl(ns),
11. function (x) {
12. return k(gcd( ????? ));
13. });
14. }
15. };
16. return gcd_list_cps(ns,function (x) { return x; });
17. };
Here is a sample session using this function:
> gcd_list( [ 5 ] ) 5 > gcd_list( [ 5, 1, 35, 40 ] ) 1 > gcd_list( [ 5, 15, 35, 40 ] ) 5 > gcd_list( [ ] ) 'Cannot ask for the gcd of the empty list'
The function above uses continuation-passing style in such a way that, if a 1 is ever encountered in the list, then the gcd function will never be called because we immediately know that the gcd of all of the numbers in the list must be 1 without the need for any computation. What should the question marks on line 5 be replaced with to ensure the function behaves this way?
Note that returning 1 (on line 6) requires no work. Of course, 1 must also be the correct return value for this case.