-1

以下のコードについて、基本ケース (n==0) の戻り値が 0 の場合、関数が常に「0」を返す理由を教えてください。この関数を修正するには、「return 0」を「return 1」に置き換えるだけでよいことはわかっていますが、以下の基本ケースで 0 を返す理由を理解しようとしています。

ご協力いただきありがとうございます

int factorial(int n) { 
    if (n == 0) { 
        return 0; 
    } else {
        return n * factorial(n-1);
    }
}

編集:うまくいけば、以下のコードに論理エラーがありません...

#include<iostream>
#include<math.h>
using namespace std;

long double factorial (long double n) {
    if (n==0) return 1;
    if (n<0) return -fabs((n*factorial(n+1)));
    return n*(factorial(n-1));
}

int main () {
    long double n;
    cout << "Enter a number: ";
    cin >> n;
    cout << "Factorial of " << n << " is " << factorial(n) <<endl;
    return 0;
}
4

6 に答える 6

5

階乗がどのように定義されているかを見ると、次のようなことがわかります。

f(0) = 1
f(1) = 1
f(n) = f(n-1) * n

したがって、関数は実際に に対して間違った値を返しますfactorial(0)。この関数の再帰は、基本的nに の新しい関数呼び出しごとにデクリメントすることによって機能しますfactorial

を呼び出すとしましょうfactorial(3)。3 の場合、ゼロに等しくないnため、else ブランチが実行されます。n呼び出しの定義の 3 番目のルールfactorial(2)(n-1) に従い、その結果に n を掛けます。関数はfactorial(0)が呼び出されるまでステップ ダウンし、0 を返します。これは、以前のすべての計算の因数であり、結果は3*2*1*0になり、それは に等しくなり0ます。

于 2011-11-20T00:56:26.610 に答える
5

このコードは単に間違っています。引数として取得する n > 0 に関係なく、すべての値は最終的に 0 で乗算されるため、すべての n > 0 に対して factorial( n ) = 0 になります。

于 2011-11-20T00:57:07.533 に答える
5

ゼロを何倍してもゼロなので、ゼロを返します。n = 5 とします。再帰を経ると、次のようになります。

n * factorial(n-1)
5 * factorial(5-1)
5 * 4 * factorial(4-1)
5 * 4 * 3 * factorial(3-1)
5 * 4 * 3 * 2 * factorial(2-1)
5 * 4 * 3 * 2 * 1 * factorial(1-1)

ただし、factorial(1-1) は factorial(0) であり、0 を返すため、次のようになります。

5 * 4 * 3 * 2 * 1 * 0 = 0
于 2011-11-20T00:58:26.987 に答える
1

以下のコードについて、基本ケース (n==0) の戻り値が 0 の場合に関数が「0」を返す理由を教えてください。

誰かがそれをすることを選んだ。なぜそんなことをしたのか作者に聞いてみてください。

この関数を修正するには、「return 0」を「return 1」に置き換えるだけでよいことはわかっていますが、以下の基本ケースで 0 を返す理由を理解しようとしています。

それを書いた人が0だと思ったからでしょう!は 0 でした。

于 2011-11-20T00:56:08.687 に答える
0

完全に質問するわけではありませんが、関数 f(int n): int oky を呼び出して短くします

n = 0 の場合、0 が返されます。これは、正しく実行するように指示したためです。n + 1 の場合、次のパターンが得られます。そして f が再び評価されます。

そのため、関数はどのような場合でも 0 を返し、基本ケースを 1 に変更すると、次のようになります。

于 2011-11-20T00:59:58.157 に答える
0

何でもn(0 以上)、多くの数を乗算するとfactorial(0)0 が返されます。

結果として

n*(n-1)*(n-2)*...*3*2*1*0

大きな脂肪です0

PS 正しく計算できないことに加えて、コードには重大な欠陥があります。負の数を与えると泣かせます。

于 2011-11-20T01:00:43.560 に答える