写一个递归函数,输入一个数组,比如数组是['a','b','c'],那么输出
<a>
<b>
<c>
</c>
</b>
</a>
能用 ruby 写更好。
1
bbx 2017-06-02 09:24:55 +08:00
递归
|
2
whatot 2017-06-02 09:25:30 +08:00
入栈出栈,不麻烦吧。递归的话,函数式编程的惯用手法,head:tail。
|
3
whatot 2017-06-02 09:30:01 +08:00
参考 haskell 里面的快排
https://learnxinyminutes.com/docs/haskell/ qsort [] = [] qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater where lesser = filter (< p) xs greater = filter (>= p) xs |
4
kindjeff 2017-06-02 09:34:47 +08:00
用栈就可以
|
5
coderluan 2017-06-02 09:36:00 +08:00
没感觉这是“算法题”,有什么特殊的吗?
|
6
linxy 2017-06-02 09:39:21 +08:00
怎么有种自己的作业自己做的感觉
|
7
wwsww OP @coderluan need a recursive function,直接写两三行就搞定了,但明确要求用递归,一下没思路了就。。。
|
8
proudzhu 2017-06-02 09:58:27 +08:00 via iPhone
递归找最外层的 <char></char> 就行了吧
|
9
AlphaTr 2017-06-02 10:00:40 +08:00
JS 的写法:
```javascript var html = function (list) { var indent = lines => lines.split('\n').map(item => ' ' + item).join('\n'); return list.length > 1 ? `<${list[0]}>\n${indent(html(list.slice(1)))}\n</${list[0]}>` : `<${list[0]}>\n</${list[0]}>` } ``` |
10
geelaw 2017-06-02 10:04:49 +08:00
要把一个非递归函数写成递归,那是很容易的,举个例子:
```C++ template <typename TIt> std::string const theAlgo(TIt &&begin, TIt &&end) { std::string result; std::string helper1{"<"},helper2{">"},helper3{"</"}; for (; begin != end; ++begin) result = helper1 + *begin + helper2 + result + helper3 + *begin + helper2; return std::move(result); } ``` 上面是非递归,下面是递归: ```C++ template <typename TIt> std::string const theAlgo(TIt &&begin, TIt &&end, bool shouldWork = true) { if (!shouldWork) return ""; theAlgo(std::forward(begin), std::forward(end), false); std::string result; std::string helper1{"<"},helper2{">"},helper3{"</"}; for (; begin != end; ++begin) result = helper1 + *begin + helper2 + result + helper3 + *begin + helper2; return std::move(result); } ``` 只要制造一个没用的调用即可。 当然,题目不是这个意思,实际上我可以写(伪代码): ```自然语言 TheAlgo(array, pos = 0) ____if (pos == array.length) return ""; ____return "<" + array[pos] + ">" + TheAlgo(array, pos + 1) + "</" + array[pos] + ">"; ``` 就是把循环变成递归,很无聊。 |
11
seeker 2017-06-02 10:09:40 +08:00
这也叫算法题了?是不是过一段时间 hello world 也叫算法题了哦。
|
12
besto 2017-06-02 10:12:20 +08:00
C 语言带函数头尾也只需要 5 行搞定。
void fun(char **list, int index, int end) { printf("%*s<%s>\n", index, "", list[index]); if (index < end - 1) fun(list, index + 1, end); printf("%*s</%s>\n", index, "", list[index]); } |
14
loadinger 2017-06-02 16:15:20 +08:00
var arr = ['a', 'b', 'c', 'd'];
arr.reverse().reduce(function(a, b, c){ return Array(arr.length - c).join('-') + '<' + b + '>\n' + a + Array(arr.length - c).join('-') + '</' + b + '>\n'; }, ''); 这样可以撒? |
15
natat 2017-06-02 21:54:21 +08:00
chars = ['a', 'b', 'c']
def chars_print(chars, spaces): if len(chars) > 0: print(spaces + '<' + chars[0] + '>') chars_print(chars[1:], spaces + ' ') print(spaces + '</' + chars[0] + '>') chars_print(chars, '') python 的解法,为啥上面的代码都那么的乱,是排版的锅? |