3

This is fine and works:

const power = (x,n) => {
  if (n === 0) return 1;
  return x * power(x, n - 1);
}

power(4,3) 64

But trying to do this as experiment - does not work gives NaN Do not understand why:

node .editor // Entering editor mode (Ctrl+D to finish, Ctrl+C to cancel)

const power = x => {
  return n => {
    if (n === 0) return 1;
    return x * power(x, n - 1);
  }
}

let t = power(4) t(3) NaN

3 Answers 3

3

You haven't converted the recursive call in the curried version to curried form. power(x, n - 1) is essentially the same as power(x) because power only accepts one argument, and this is a function, so not unreasonably becomes NaN when you try to multiply it by a number.

Rewrite it like this instead:

const power = x => {
  return n => {
    if (n === 0) return 1;
    return x * power(x)(n - 1);
  }
};

console.log('4^3 = ', power(4)(3));     // 64
console.log('2^10 = ', power(2)(10));   // 1024
console.log('5^4 = ', power(5)(4));     // 625
console.log('3^4 = ', power(3)(4));     // 81

Sign up to request clarification or add additional context in comments.

Comments

2

You could store the nested function and return the function and use this function for another call with only the changed n.

const
    power = x => {
        const
            fn = n => n === 0
                ? 1
                : x * fn(n - 1);

        return fn;
    };

console.log(power(4)(3));

3 Comments

Is that Tab before "power" on purpose? Looks weird xd
@JesúsGuillénYparrea, yes it is, because const is only the lead in of the statement and the indentation is the listing of variables.
i see... I have never seen that style before, but it makes sense now.
1

As we are discussing "weird" function forms I might as well contribute my two cents worth:

You can also do the curried function as a one-liner like this:

const power = (x,pow) => pow = n => --n ? x*pow(n) : x;

console.log(power(3)(4)); // 81

This is, of course, something that nobody in their right mind would ever do. Still - it works!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.