Saya membutuhkan fungsi yang mengambil n dan mengembalikan 2 n - 1 . Kedengarannya cukup sederhana, tetapi fungsinya harus bersifat rekursif. Sejauh ini saya hanya punya 2 n :
def required_steps(n):
if n == 0:
return 1
return 2 * req_steps(n-1)
Latihan menyatakan: "Anda dapat mengasumsikan bahwa parameter n selalu bilangan bulat positif dan lebih besar dari 0"
1 << n
tidak bisa meluap. Ini tampaknya merupakan latihan dalam menemukan cara untuk membusuk(1<<n) - 1
menjadi beberapa langkah, mungkin mengatur setiap bit satu per satu seperti yang ditunjukkan oleh beberapa jawaban.def fn(n): if n == 0: return 1; return (2 << n) - fn(0); # technically recursive
C:\MyFolder
Jawaban:
2**n -1
juga 1 + 2 + 4 + ... + 2 n-1 yang dapat dibuat menjadi fungsi rekursif tunggal (tanpa yang kedua untuk mengurangi 1 dari kekuatan 2).Petunjuk : 1 + 2 * (1 + 2 * (...))
Solusi di bawah, jangan lihat jika Anda ingin mencoba petunjuk itu terlebih dahulu.
Ini berfungsi jika
n
dijamin lebih besar dari nol (seperti yang dijanjikan dalam pernyataan masalah):Versi yang lebih kuat akan menangani nilai nol dan negatif juga:
(Menambahkan cek untuk non-integer dibiarkan sebagai latihan.)
sumber
required_steps(0)
sekarang menyebabkan rekursi yang tak terbatas2^0 - 1
== 0. Tambahkan yang lainif
untuk kasing itu.int
, kita tidak tahu apa yang harus dilakukan ketika n <0. Menghitung? Melempar kesalahan? Kembali 0? Dalam hal ini, kita hanya dapat melakukan fungsi parsial (mendefinisikannya untuk hal-hal yang kita tahu apa hasilnya).0
dan digunakann - 1
untuk submasalah. Domain Bilangan Alami sepertinya cocok.Untuk memecahkan masalah dengan pendekatan rekursif Anda harus mengetahui bagaimana Anda dapat mendefinisikan fungsi dengan input yang diberikan dalam hal fungsi yang sama dengan input yang berbeda. Dalam hal ini, karena
f(n) = 2 * f(n - 1) + 1
, Anda dapat melakukan:maka:
output:
sumber
Anda dapat mengekstrak bagian yang sangat rekursif ke fungsi lain
Atau Anda dapat mengatur bendera dan menentukan kapan harus mengurangi
sumber
Menggunakan parameter tambahan untuk hasilnya,
r
-Anda juga dapat menulisnya menggunakan shift kiri bitwise,
<<
-Outputnya sama
sumber
else
klausa di salah satu fungsir * 2
menjadir << 1
dan itu "tidak dapat dibaca sama sekali"? 😂n
kali dan kemudian mengurangi 1. Sepertinya bahkan kurang elegan maka perlu, meskipun semuanya adalah latihan dalam inefisiensi vs(1<<n) - 1
.Mintalah pengganti untuk mengingat nilai asli dari n dan kemudian untuk langkah pertama yaitu
n == N
, kembali2^n-1
sumber
Salah satu cara untuk mendapatkan offset "-1" adalah menerapkannya sebagai imbalan dari panggilan fungsi pertama menggunakan argumen dengan nilai default, lalu secara eksplisit mengatur argumen offset ke nol selama panggilan rekursif.
sumber
Di atas semua jawaban luar biasa yang diberikan sebelumnya, di bawah ini akan menunjukkan implementasinya dengan fungsi internal.
Pada dasarnya, ini memberikan nilai global n ke k dan mengulanginya dengan perbandingan yang sesuai.
sumber