n power n打印'Hello World'而不计算值

时间:2018-03-21 06:30:12

标签: python loops recursion exponent

我想在不计算python中 customersList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (customersList.getAdapter() == adapter) { String[] invoice =(String[]) parent.getAdapter().getItem(position); switch (invoice[6]){ case "Payment": Intent approvalDetailsIntent1 = new Intent(previous.this,PpaymentDetails.class); approvalDetailsIntent1.putExtra(Common.APPROVALID,invoice[0]); approvalDetailsIntent1.putExtra(Common.ENTRYNO, invoice[1]); approvalDetailsIntent1.putExtra(Common.PAYMENT_MODE, invoice[4]); approvalDetailsIntent1.putExtra(Common.PAYMENT_DATE, invoice[3]); approvalDetailsIntent1.putExtra(Common.AMOUNT, invoice[5]); approvalDetailsIntent1.putExtra(Common.COMPANY_DETAILS, invoice[2]); approvalDetailsIntent1.putExtra(Common.GENERAL_NOTES,invoice[8]); approvalDetailsIntent1.putExtra(Common.PAYMENT_TYPE, invoice[6]); startActivity(approvalDetailsIntent1); break; case "Expense": Intent approvalDetailsIntent2 = new Intent(previous.this, PexpenseDetail.class); approvalDetailsIntent2.putExtra(Common.APPROVALID, invoice[0]); approvalDetailsIntent2.putExtra(Common.REFNO, invoice[1]); startActivity(approvalDetailsIntent2); break; } // Common.toastMessage(getContext(), "scene aan"); } else if (customersList.getAdapter() == Padapter) { String[] payment =(String[]) parent.getAdapter().getItem(position); Intent approvalDetailsIntent1 = new Intent(previous.this,PpaymentDetails.class); approvalDetailsIntent1.putExtra(Common.APPROVALID, payment[0]); approvalDetailsIntent1.putExtra(Common.ENTRYNO, payment[1]); approvalDetailsIntent1.putExtra(Common.PAYMENT_MODE, payment[4]); approvalDetailsIntent1.putExtra(Common.PAYMENT_DATE, payment[3]); approvalDetailsIntent1.putExtra(Common.AMOUNT, payment[5]); approvalDetailsIntent1.putExtra(Common.COMPANY_DETAILS, payment[2]); approvalDetailsIntent1.putExtra(Common.GENERAL_NOTES, payment[8]); approvalDetailsIntent1.putExtra(Common.PAYMENT_TYPE, payment[6]); startActivity(approvalDetailsIntent1); } else if (customersList.getAdapter() == Eadapter) { String[] pExpence =(String[]) parent.getAdapter().getItem(position); Intent approvalDetailsIntent2 = new Intent(previous.this, PexpenseDetail.class); approvalDetailsIntent2.putExtra(Common.APPROVALID, pExpence[0]); approvalDetailsIntent2.putExtra(Common.REFNO, pExpence[1]); startActivity(approvalDetailsIntent2); } } }); 的值的情况下打印Hello World n**n次。

例如,

如果n为2,则应打印n**n 4次。

如果n为3,则应打印'Hello World' 27次,依此类推。

我被允许使用循环和递归但现在允许使用任何内置函数或计算n ** n的值并多次打印。

提前谢谢。

3 个答案:

答案 0 :(得分:4)

首先:

def compose(f, g):
    def wrapper(x):
        return f(g(x))
    wrapper.__name__ = f'compose({f.__name__}, {g.__name__})'
    return wrapper

def ntimes(n):
    def wrap(func):
        if n == 1: return func
        return compose(func, ntimes(n-1)(func))
    return wrap

这应该是显而易见的,对吗? ntimes(3)是一个函数,可以将任何函数与自身组合3次,因此ntimes(3)(func)(x)func(func(func(x)))

现在,我们只需要在ntimesntimes拨打两个级别相同的n。我可以编写一个nntimes函数来执行与ntimes相同的操作,但是对于多样性,让它更平坦:

def nntimes(n, func, arg):
    f = ntimes(n)
    return f(f)(func)(arg)

因此,nntimes(n, func, arg)会在ntimes(n)上调用ntimes(n),它会为您提供一个函数,用于组合其参数n**n次,然后在arg上调用该函数。

现在我们只需要传入一个函数。print不起作用,因为它会返回None,因此您无法自行编写它。所以:

def printret(x):
    print(x, end=' ')
    return x

现在我们称之为:

>>> nntimes(2, printret, 'Hi')
hi hi hi hi
>>> nntimes(3, printret, 'Hi')
hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi

如果你仍然无法理解发生了什么,也许这会有所帮助。让我们做一些比一般nntimes更简单的事情,然后硬编码三,然后打印出构图:

>>> thrice = ntimes(3)
>>> print(thrice(thrice)(printret).__name__)
compose(compose(compose(printret, compose(printret, printret)), compose(compose(printret, compose(printret, printret)), compose(printret, compose(printret, printret)))), compose(compose(compose(printret, compose(printret, printret)), compose(compose(printret, compose(printret, printret)), compose(printret, compose(printret, printret)))), compose(compose(printret, compose(printret, printret)), compose(compose(printret, compose(printret, printret)), compose(printret, compose(printret, printret))))))

所有这些括号!就像我已经死了,去了Lisp!

如果你在Church numerals上阅读,你会发现我在这里被骗了。将简单的函数写入Church-编码一个数字并对两个Church数字进行取幂,然后将其与我的代码进行比较。那么,我真的避免计算n**n的价值吗?

当然,你可以通过一个简单的平面递归和没有高阶函数,或者用itertools来做更多这样的事情(好吧,你不允许使用内置函数,但是所有内容都是itertools在文档中附带了源和/或或大致相同的&#34;函数,因此您可以复制它。但那有趣的是什么?毕竟,如果你真的想要一个Pythonic,简单或高效的版本,你只需循环range(n**n)。我认为这个采访问题的重点是强迫你在Pythonic框外思考。

答案 1 :(得分:0)

>>> def new(number,loop):
...     if loop == 1:
...         return number
...     else:
...         return number * new(number,loop-1)
... 
>>> a = new(3,3)
>>> print a
27
>>> print "Hello "*a
Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello 
  
    
      

    
  

答案 2 :(得分:0)

只是为了好玩并给出一个有启发性的答案,你可以用一个非常简单的递归函数这样做而不用计算n**n

def fun(n, level):
    if (level == n):
        print('Hello World')
        return 
    for i in range (n):
        fun(n, level+1)

如果你试试

fun(2,0)

你得到了

Hello World
Hello World
Hello World
Hello World

fun(3,0)同样的作品...希望有所帮助。是一个相当简单的解决方案。 @abarnert精彩的解决方案!

最好,翁贝托