【问题标题】:Recursive function doesn't return递归函数不返回
【发布时间】:2017-01-12 17:25:10
【问题描述】:
<?php

function generateRandomString($length = 10, $alpha = false, $numeric = false) {

  if ($alpha)   { $characters = 'ABCDEFGHJKLMNPQRSTUVWXYZ'; }
  if ($numeric) { $characters = '0123456789'; }

  $charactersLength = strlen($characters);
  $randomString = '';

  for ($i = 0; $i < $length; ++$i) {
    $randomString .= $characters[rand(0, $charactersLength - 1)];
  }

  if (substr($randomString, 0, 1) != 2) { // if doesn't start with 2
    generateRandomString($length, $alpha, $numeric); // try again
  }
  else {
    return $randomString;
  }
}

$num = generateRandomString(8, false, true);
echo ($num);

我需要它返回一个以2 开头的值,但它根本不返回任何内容,也没有错误。我在这里做错了什么?

【问题讨论】:

  • return generateRandomString(...);
  • 问题标题说它调用:递归调用不返回...
  • 1) 递归调用函数没有什么特别之处。将内部generateRandomString 调用替换为对任何其他函数(如substr)的调用,问题就很明显了。 2) 如果您的要求是生成一个以2 开头的字符串...呃...您如何以$randomString = '2' 开头而不是产生潜在的无限递归?
  • 如果两个不同的参数$alpha$numeric 互斥并且不能同时为假(默认值),那么它们有什么意义呢?
  • 另外……如果我打电话给generateRandomString(8, true, true)怎么办?然后我不会收到字母数字结果。如果我调用generateRandomString(8, true),函数将永远不会完成。

标签: php recursion


【解决方案1】:

这里使用return,改变这个

if (substr($randomString, 0, 1) != 2) { // if doesn't start with 2
  generateRandomString($length, $alpha, $numeric); // try again
}

if (substr($randomString, 0, 1) != 2) { // if doesn't start with 2
 return generateRandomString($length, $alpha, $numeric); // try again
}

【讨论】:

  • 第一次使用递归函数,很好学习,谢谢!关于递归的笑话太真实了——要理解递归,你必须先理解递归。
猜你喜欢
  • 2015-10-22
  • 2012-09-21
  • 2016-06-30
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多