2016-07-21 4 views
0

オンラインクラスで、私はこの問題を受け取りました。数値が持つ除数の数を出力する簡単な再帰関数を作るにはどうすればよいですか?

Nを均等に分割する1からNまでの整数を返す関数numDivisors(N)を記述します。たとえば、numDivisors(42)は1,2,3,6,7,14,21,42が42の約数なので8を返します。(Python 2.7)

私はループで解決しましたが、私は再帰でこれについてどうやって行くのだろうと思っています。

ループでこの関数の基本的な機能は次のようになります。

def numDivisors(N):  
    """ returns # of integers that divide evenly into N """ 
    divisors = 1 # the factor 1 
    if N != 1: 
     divisors += 1 # the factor N 

    for i in range(2,int(N)): # loops through possible divisors 
     if N % i == 0: # factor found 
     divisors += 1 
    return divisors 

どのように私は(内包表記を一覧表示する宣言、条件分岐、ループなどアップ)裸の基礎を使用して再帰的にそれを実装するだろうか?

ありがとうございます!

答えて

1

def find_divisors(N,i=1): 
    if i >= N**0.5+1: return set([]) 
    if N%i == 0: return set([i,N//i]).union(find_divisors(N,i+1)) 
    return find_divisors(N,i+1) 

について再帰が、この問題にはかなりお粗末なソリューションがどのように...あなたは本当にすべての約数を見つける必要がありますか?あなたは特別なものをお探しですか?私たちは、再帰的でなければならない場合

+2

'N'は完璧な正方形である場合、それは平方根をミス、例えば'' N = 4' - > 'set([1,4])'、 'N = 9' - >' set([1、9]) 'などです。 – mhawke

1

>>> def ndiv(N, i=1): 
... return 1 if N==i else ((N % i == 0) + ndiv(N, i+1)) 
... 

はのは、それをテストしてみましょう。質問の通り:

例えば、numDivisors(42)8

>>> ndiv(42) 
8 

を返すしたがって、これは、所望の出力を生成します。

我々はここで、再帰を離れて行うことができます場合は、単にリストの内包表記を使用してそれを行う方法である。このアルゴリズムは、正しい結果が得られない

>>> def div(N): 
...  return sum(1 for i in range(1, N+1) if N % i == 0) 
... 
>>> div(42) 
8 
関連する問題