【问题标题】:Practical examples of Mutual Recursion?相互递归的实际例子?
【发布时间】:2013-07-12 22:44:45
【问题描述】:

我正在阅读有关相互递归的内容。在几乎所有的材料中,都有判断整数是偶数还是奇数的问题的例子?

int is_even(unsigned int n)
{
    if (n==0) return 1;
    else return(is_odd(n-1));
}

int is_odd(unsigned int n)
{
    return (!iseven(n));
}

显然上述问题可以使用取模运算符以更简单的方式解决。

另一个例子是找出一个人是女性还是男性的问题。这也可以在不使用递归的情况下以更简单的方式解决。

那么相互递归只是理论上的还是我可以在任何地方实际使用它来使我的解决方案比使用任何其他技术更简单?

你能帮我举个例子吗?

【问题讨论】:

  • 最小最大算法就是一个很好的例子

标签: algorithm data-structures recursion mutual-recursion


【解决方案1】:

相互递归不是很常见,但有时很有用。使用“递归下降”方法解析文本是一种实用的设置,您可以在其中找到它。

http://en.m.wikipedia.org/wiki/Recursive_descent_parser

【讨论】:

    【解决方案2】:

    我通常有一个用例是在编写程序来玩游戏时。在这种情况下,您通常会使用递归来遍历博弈树来计算最佳移动。

    虽然它通常可以在没有相互递归的情况下非常简单地完成,但当每个玩家的逻辑足够复杂以保证其自己的功能,并且有足够多不同的玩家可以尝试时,以这种方式编写代码会很有帮助使一个巨大的功能变得一团糟。

    【讨论】:

      【解决方案3】:

      真的很晚了,一个例子是Quickselect算法,如果你的枢轴策略是Median-of-medians算法,因为中位数枢轴方法调用快速选择来计算n/5的中位数每个 5 元素组的中位数。

      另一个流行的方法是在 Scheme 中编译 s-expression 的 eval-apply 方法,Matt Might 的以下实现:

       eval takes an expression and an environment to a value
      (define (eval e env) (cond
        ((symbol? e)       (cadr (assq e env)))
        ((eq? (car e) 'λ)  (cons e env))
        (else              (apply (eval (car e) env) (eval (cadr e) env)))))
      
      ; apply takes a function and an argument to a value
      (define (apply f x)
        (eval (cddr (car f)) (cons (list (cadr (car f)) x) (cdr f))))
      
      ; read and parse stdin, then evaluate:
      (display (eval (read) '())) (newline)
      

      【讨论】:

        猜你喜欢
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 2011-08-14
        • 2021-11-19
        • 1970-01-01
        相关资源
        最近更新 更多