繁体   English   中英

递归和Python问题

[英]Recursion and Python issue

我一直试图理解递归。 但我不认为我已经掌握了它。

这是我的代码的大纲:

def f():

    used = [anything]
    new = []

    while i < something:
        new.append(i)
        i += 1

    for i in new:
        if i in used:
            f()
        else:
            return new

现在,我认为我不能使用它,因为我没有迭代,也没有基本情况。 我需要继续运行这个程序,直到我得到一组未使用的值(随机选取)。 实现这一目标的最佳方法是什么? 创建另一个功能?

任何帮助将不胜感激。

谢谢!

首先,您需要添加参数,否则它不是真正的递归。 要点是这样的

f(x):
    x-=1
    if x < 5:
        return x
    else:
        f(x)

递归点是使用新参数调用自身内部的函数。 x每次都会改变值,所以最终如果会降到5以下,你将返回x(将是4)。 所以它将是f(7),减1,f(6),减1,f(5),减1,f(4),返回4。

你也没有定义i或者什么东西,所以你会有一个无限循环因为我总是会少一些,事实上,我对代码的工作感到惊讶,因为它们都没有被定义过。

您应该添加函数的参数,并将适当的参数传递给递归函数调用。

例如:

def f(new, used, i):

我认为定期的while循环将比递归调用更明智地解决这个问题。 我不完全理解你用这段代码想要实现的目标,但是这里用你的比喻重写:

def f(used):

    new = []

    while len(new) == 0 :
        while i < something:
            new.append(i)
            i += 1

        for i in new:
            if i in used:
                new = []
                break

    return new

我认为你关注的例子是递归的一个不好的例子。 查看问题的迭代解决方案几乎更容易。 有了一个完美的递归示例,很难看到任何其他解决方案而不是递归解决方案。

递归的一个典型例子是导航面向树的数据结构。

这是一个简单的例子(几乎没有测试......):

#!/usr/bin/python

tree = {'text': '1',
        'brnch': [{
                  'text': '1.1',
                  'brnch': [{
                            'text': '1.1.1',
                            'brnch': [{
                                      'text': '1.1.1.1',
                                      'brnch': []}]},
                           {'text': '1.1.2',
                            'brnch': []},
                           {'text': '1.1.3',
                            'brnch': []}]},
                 {'text': '1.2',
                  'brnch': []}]}

def recurse_traverse(tree):
    print ' ' * recurse_traverse.level + tree['text']
    for branch in tree['brnch']:
        recurse_traverse.level += 1
        recurse_traverse(branch)
        recurse_traverse.level -= 1

if __name__ == '__main__':
    import os
    print "testing", os.path.abspath(__file__)   
    recurse_traverse.level = 1
    recurse_traverse(tree)

精美的在线书籍Think Like a Computer Scientist有更多的递归示例。

如果我理解正确,你要求一个递归函数来生成一个未包含在另一个列表中的伪随机值列表。 此递归函数将生成used不存在的size数量的伪随机值。

from sets import Set
import random

used = Set([1,2,3,4,5])

def f(new, size):
  # Check if we have enough 'new' values that are not in the 'used' set
  if len(new.difference(used)) < size:
    new.add(random.randint(0,100)) # Generate a pseudo-random value and
                                   # add it to the 'new' set
                                   # Values are between 0-100 inclusive
                                   # but you can change that to whatever you like
    new = f(new, size) # Append our results to `new`, this will get the result set
  return new.difference(used) # Return only the different 
                              # values between the two sets

result = f(Set(), 10) # Start with a blank set and a request for a result with 10 values
print(result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM