2017-10-26 17 views
0

私は、2の累乗を再帰的に計算する関数を構築しました。これは特定の値nまでです。2つの結果を伴う再帰

let rec aux_pow = 
fun e n -> 
    match n with 
    | n   -> 1  # I tried with e, but clearly it modifies the result 
    | _   -> 2 * aux_pow (e + 1) n 

この関数は、他の関数でパラメータなどとして使用できる整数(2,4,8,16 ... n)を返します。簡単です。私が探しているのは、eの値、つまりパワーのグレードも返す方法です。それは実際に可能ですか?私は、各関数が値だけを返すことができることを知っています。 の結果を、この場合はの再帰サイクルを得るための最善の方法は何ですか?

I.e. aux_pow 0 8の場合3に等しいの値を持つと同時に、関数が2 * 2 * 2 = 8の結果を返すようにするにはどうすればよいですか?出来ますか?それは無意味な問題ですか?

答えて

3

関数から2つの値を返す最も簡単な方法は、tuplesを使用することです。私はあなたが提供したサンプルコードでいくつかの自由をとり、あなたが探しているものを行うべきバージョンを考え出しました。

let aux_pow limit = 
    let rec aux_pow' value counter = 
    match value with 
    | n when n = limit -> (limit, counter) 
    | n when n > limit -> (int (2. ** double (counter - 1)), counter - 1) 
    | _ -> aux_pow' (2 * value) (counter + 1) 

    aux_pow' 1 0 

実行された回数をカウントする内部再帰関数を定義します。出力は値とカウントを持つタプルです。

これには、2の非累乗値が制限値に指定されている場合も含まれます。