2016-11-30 17 views
2

私はまだ基​​本的な再帰に問題があります。再帰関数への変換?

unsigned long factorial(int x) 
{ 
    // recursive function to find factorial 

    if(x==1) 
     return 1; // base case 
    return x * (factorial(x-1)); // recursive call 
} 


int choose(int choose, int choose_from) 
{ 
    // function to find how many different ways to "choose" 
    // calls factorial function multiple times 

    return factorial(choose_from)/(factorial(choose) * factorial(choose_from - choose)); 
} 

私のインストラクターが、これは実際には間違っていると私は選択した機能に再帰しなければならない私に言ったように、私は2つの機能が示されています。私は選択式がのように与えられて以来、どのようにC(n、r)= n! /(r!・(n-r)!)、そして再帰されているのはすべて階乗であるから、私はちょうど別の階乗関数を作った。

新しいライブラリを使用せずにこれらの2つの関数が1つの再帰関数になる方法はありますか?

+0

2項間の関係には無限大があります。適切に再帰的に見えるものを選んでください。これを使って。 –

+3

さて、C(n、r)を計算するために今やっているように、すべての階乗を計算する必要はありません。数式を紙に書いて値をキャンセルしてください。あなたは数回の乗算だけ残すべきです。たとえば 'C(52、51)' - あなたは確かに計算する必要はありません52! 51!答えを得る。 – PaulMcKenzie

+0

私はこれに近づけるための良い方法**は、パスカルの三角形を、その​​行の前の数字から計算することによって提示することです。数字ごとの固定数の算術演算を使用します。計算では、行の番号の配置などの情報を使用できます。私は高校でこれをやっていることを覚えています(i8085コンピューターで)、それは非常に実践的で有益です。これにより、再帰式として簡単に表現できる関係が得られます。そして 'choose'関数で使用されます。 –

答えて

1

まず、選択関数の引数の順序は、C関数の引数の順序に比べて切り替わります。

今、何を、あなたのインストラクターが意味することは、彼がそうのような例えば選択機能再帰を望んでいることである。この定義

C(N, 1) = N 
C(N, K) = C(N, K-1) * (N + 1 - K)/K 

C(n, r) = n!/(r! · (n – r)!) = n/(n-r) * (n-1)!/(r! · (n -1 – r)!) = n/(n-r)*C(n-1, r) 
+0

確かにC(n、r)= n * C(n、r)は正しくありません。タイプミス? –

+0

@ Cheersandhth.-Alf fixed –

+0

ああ。まあ、C(n、r)= n * C(n-1、r)は純粋な階乗になります。 –

4

私はあなたのインストラクターが、あなたがこのrecurrent definitionを使用したいと思いますあなたのchoose関数の中で、階乗、再帰を使用するのを避けることができます。

+0

私は、学生が再帰的な定義を導くことができると期待されているのだろうかと思います。ヘルパー(エントリー)関数では、C(N、K)= C(N、min(N-K、K))から始めることで再帰回数を減らすことができます。例:C(10,8)== C(10,2) – rcgldr

+0

反復定義はC(N、0)= 1で始める必要があります。[境界値](http://en.wikipedia.org/wiki/)を参照してください。 Binomial_coefficient#Recursive_formula) – rcgldr