需要帮助使用递归将二进制转换为十进制。
到目前为止我有:
(2 * int(s [0]))+ int(s [1])
当s == 0和s == 1时的基本情况。
我不确定如何递归传递这个函数,以便函数将通过输入中的所有1和0。
Need help converting binary to decimal, using recursion.
So far I have :
(2* int(s[0])) + int(s[1])
with base cases for when s==0 and s==1.
I'm not sure how to pass this recursively so that the function will pass through all 1's and 0's in input,s.
最满意答案
基本的想法是选择字符串的最后一个字符并将其转换为数字,然后乘以适当的2的幂。我已经为您评论了代码。
# we need to keep track of the current string, # the power of two, and the total (decimal) def placeToInt (str, pow, total): # if the length of the string is one, # we won't call the function anymore if (len(str) == 1): # return the number, 0 or 1, in the string # times 2 raised to the current power, # plus the already accumulated total return int(str) * (2 ** pow) + total else: # grab the last digit, a 0 or 1 num = int(str[-1:]) # the representation in binary is 2 raised to the given power, # times the number (0 or 1) # add this to the total total += (num * (2 ** pow)) # return, since the string has more digits return placeToInt(str[:-1], pow + 1, total) # test case # appropriately returns 21 print(placeToInt("10101", 0, 0))现在,让我们手动完成它,这样您就可以理解为什么会这样。
# n = 101 (in binary # this can also be represented as 1*(2^2) + 0*(2^1) + 1*(2^0) # alternatively, since there are three digits in this binary number # 1*(2^(n-1)) + 0*(2^(n-2)) + 1*(2^(n-3))那么这是什么意思? 好吧,最右边的数字是1或0倍2上升到零的幂。 换句话说,它要么总计加1或0。 那第二个最右边的数字怎么样? 它要么总计加0或2。 下一个? 0或4.看模式?
让我们写下伪代码:
let n = input, in binary total = 0 power of 2 = 0 while n has a length: lastDigit = last digit of n add (2^pow)*lastDigit to the current total由于我们从一个功率开始,总共为0,你可以看到为什么这个有效。
The basic idea is to pick off the last character of the string and convert that to a number, then multiply it by the appropriate power of 2. I've commented the code for you.
# we need to keep track of the current string, # the power of two, and the total (decimal) def placeToInt (str, pow, total): # if the length of the string is one, # we won't call the function anymore if (len(str) == 1): # return the number, 0 or 1, in the string # times 2 raised to the current power, # plus the already accumulated total return int(str) * (2 ** pow) + total else: # grab the last digit, a 0 or 1 num = int(str[-1:]) # the representation in binary is 2 raised to the given power, # times the number (0 or 1) # add this to the total total += (num * (2 ** pow)) # return, since the string has more digits return placeToInt(str[:-1], pow + 1, total) # test case # appropriately returns 21 print(placeToInt("10101", 0, 0))Now, let's go through it manually, so you understand why this works.
# n = 101 (in binary # this can also be represented as 1*(2^2) + 0*(2^1) + 1*(2^0) # alternatively, since there are three digits in this binary number # 1*(2^(n-1)) + 0*(2^(n-2)) + 1*(2^(n-3))So what does this mean? Well, the rightmost digit is 1 or 0 times 2 raised to the power of zero. In other words, it either adds 1 or 0 to the total. What about the second rightmost digit? It either adds 0 or 2 to the total. The next one? 0 or 4. See the pattern?
Let's write the pseudocode:
let n = input, in binary total = 0 power of 2 = 0 while n has a length: lastDigit = last digit of n add (2^pow)*lastDigit to the current totalSince we start with a power and a total of 0, you can see why this works.
更多推荐
发布评论