-5
#import <Foundation/Foundation.h>

@interface Factorial : NSObject 
+(int) factorial:(int) n;
@end

@implementation Factorial

+(int) factorial:(int)n
{
    if (n==0) {
        return 1;
    }
    else
    {
        return [self factorial:n]*[self factorial:n-1];
    }
}

@end

int main (int argc, const char * argv[])
{
    int i = [Factorial factorial:5];
    NSLog(@"%d", i);
    return 0;
}

このコードの問題は何ですか?? 私は客観的 c の初心者です (私は c のバックグラウンドから来ました) または、私は客観的 c について間違った概念を取得していますか??

(Compiler generating ..)
GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys002
sharedlibrary apply-load-rules all
[Switching to process 1413 thread 0x0]
warning: Unable to restore previously selected frame.
(gdb) 

行 +(int) factorial:(int) n で行き詰まり、@implementation で EXC_BAD_ACESS が発生します。

ありがとう

4

3 に答える 3

2

を計算したいのですfactorial:nが、関数では。の結果を使用しますfactorial:n

変化する: return [self factorial:n]*[self factorial:n-1];

に: return n*[self factorial:n-1];

于 2012-12-10T07:44:42.220 に答える
1

コードを変更する必要があります

return n*[self factorial:n-1];

することが

return  n* (n != 1 ? [self factorial:n-1] : 1);

最初のものは無限ループを作ります

例えば:

int factorial = [self factorial:3];
NSLog(@"factorial 3 >> %i",factorial); the result is "factorial 3 >> 6"
于 2016-07-23T12:58:39.657 に答える
1

私は ObjC に精通していませんが、行:

+(int) factorial:(int)n
    //...
    return [self factorial:n]*[self factorial:n-1];
    //                      ^

私には疑わしいように見えます。n != 0 の場合、無限の再帰が発生し、スタックオーバーフローが発生することを意味します:-)

于 2012-04-29T07:15:03.103 に答える