题目要求用递归打印从1到N位的最大整数(十进制),如n=2 返回[1,2,…99].
实际上这道题是想让我们用全排列的思想分别按位进行递归,每位有0-9这十种可能。然而当用python写的时候不好用string类型存储数字,因为字符串不可改变。而用list存储数字的时候是酱紫的[1,9],对应数字19.然后还要对这个再进行处理。
所以干脆用最简单的数字,递增递归。(这样栈会爆,因为这是一个大数问题,python中栈有最大值,而且没有对尾递归做优化。然而我只是想用这个先打个样。)结果又出现了新的问题。发现我对递归的人是真是好模糊!对python的函数编程真的好浅薄!
class Solution:
# @param n: An integer.
# return : A list of integer storing 1 to the largest number with n digits.
def numbersByRecursion(self, n,result):
# write your code here
largest = pow(10,n)-1
i = 1
*self.recursion(i,largest,result)*
def recursion(self,num,largest,result):
if num > largest:
print 'num = ',num
return result
result.append(num)
return self.recursion(num+1,largest,result)
if __name__ == '__main__':
result = []
sol = Solution()
re = sol.numbersByRecursion(1,result)
print re
怎么调试都是返回None!这是为什么呢?stackoverflow上有个人给出个写法:
def numbersByRecursion(n,largest,result):`
def recursion(num,largest,result):
if num <= largest:
result.append(num)
return recursion(num+1,largest,result)
else:
return result
return recursion(n,largest,result)
哎他的怎么就可以呢?而且def函数可以嵌套,想起了保健哥的形式化方法的课,感觉学的东西又都还给他了。以前讲的Continuation和CPS以及高阶函数学好了感觉理解这个和递归就比较简单了:(
后来发现我上一个程序斜体的地方忘记写了return。这样每次到这里都调用自己做下一层递归(recursion函数),最后返回到最初调用recursion的函数numberByRecursion的时候虽然Recursion返回了Result,但是并没有人接,不仅没人接,numberByrecursion还没有return,那默认是返回None的,所以返回了None,而不是result 列表。
感觉对递归的理解不是很深。不知道上面的想法是否正确,欢迎明白的同学在评论下方发言指正!尤其是对递归和CPS有理解的童鞋!