2

したがって、これは明らかに有効なコードですが、引数が 以外powerの場合に への 2 番目の呼び出しを完了する方法がわかりません。exponent0

function power(base, exponent) {
  if (exponent == 0)
    return 1;
  else
    return base * power(base, exponent - 1);
}

から: http://imgur.com/Sa2BfHJ

4

4 に答える 4

8

2回目の呼び出しは、0になるまで指数の小さい数値で呼び出し続け、その後1を返し、結果を集計してロールバックするため...

再帰について少し読む必要があると思います:)

これがどのように見えるかの簡単なケースです:

power(2,2) 
 power(2,1) 
    power(2,0) 
       return 1 
    return 2*1 = 2 
 return 2*2 = 4 

このページから取得および変更されました。

再帰のアニメーション ビューについては、このページを試してください(私にはうまくいきませんでした。古いページであり、Java が必要で、私のマシンにはインストールされていません ...)


編集:
これの簡単な例が見つからなかったので、これがどのように機能しているかを視覚化するのに役立つ簡単なコンソールプログラムを次に示します。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SO_Console
{
    class Program
    {
        static void Main(string[] args)
        {
            int base_value = 0;
            int exponent = 0;
            string[] parts = new string[2];
            int result = 0;
            Console.Out.WriteLine("Please enter the Power to calculate in this format: x^y "
            + Environment.NewLine + "(where x is the base (int) and y is the exponent (int)."
            + Environment.NewLine);

            var temp = Console.ReadLine();
            if (!string.IsNullOrWhiteSpace(temp))
            {

                parts = temp.Split('^');
                if (parts.Length != 2)
                InvalidInput();
            }
            else
            InvalidInput();


            if (Int32.TryParse(parts[0], out base_value) && Int32.TryParse(parts[1], out exponent))
            result = Power(base_value, exponent, "");
            else
            InvalidInput();

            Console.Out.WriteLine(Environment.NewLine + "Final result = {0}", result);


            Console.Out.WriteLine(Environment.NewLine + "Hit any key to quit.");
            Console.Read();

        }

        /// <summary>
        /// Recursive call to calculate Power x^y
        /// </summary>
        /// <param name="base_value">The base</param>
        /// <param name="exponent">The exponent</param>
        /// <param name="padding">Padding, for output.</param>
        /// <returns></returns>
        private static int Power(int base_value, int exponent, string padding)
        {
            Console.Out.WriteLine(string.Format("{2}Power called with: {0}^{1}", base_value, exponent, padding));
            Thread.Sleep(750);

            if (exponent == 0)
            {
                Console.Out.WriteLine("{0}{1}Base case reached, returning 1.{0}", Environment.NewLine ,padding);
                return 1;
            }
            else
            {
                var return_value = base_value * Power(base_value, exponent - 1, padding + "  ");
                Console.Out.WriteLine("{0}Going back in the recursion, returning {1}.", padding, return_value);
                Thread.Sleep(750);
                return return_value;
            }
        }

        /// <summary>
        /// Inform user about bad input and quit.
        /// </summary>
        private static void InvalidInput()
        {
            Console.Out.WriteLine("Invalid input.");
            return;
        }
    }
}

貼り付けて実行するだけで、結果は次のようになります。

出力サンプル

編集 2:
私はこれについて記事を書き、何がなぜどこで起こるかを詳細に説明しました。こちらでご覧いただけます: simple power recursion, console application .

于 2013-11-15T02:13:27.467 に答える
1

x n = x × x n-1および x 0 = 1 であることに注意してください。これが、コードが正しい理由です。

于 2013-11-15T02:16:14.247 に答える
1

例を試してみてください。これは 2 の 3 乗です

power(2,3) = 2 * (power(2,2) = 2 * (power(2,1) = 2 * (power(2,0) = 1)))

そう:

power(2,3) = 2 * (2 * (2 * 1)))
于 2013-11-15T02:16:30.387 に答える